diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..0792692 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,16 @@ +# Editor configuration, see https://editorconfig.org +root = true + +[*] +charset = utf-8 +indent_style = space +indent_size = 4 +insert_final_newline = true +trim_trailing_whitespace = true + +[*.ts] +quote_type = single + +[*.md] +max_line_length = off +trim_trailing_whitespace = false diff --git a/.eslintrc.json b/.eslintrc.json new file mode 100644 index 0000000..75a1859 --- /dev/null +++ b/.eslintrc.json @@ -0,0 +1,132 @@ +{ + "env": { + "browser": true, + "es2021": true, + "node": true + }, + "extends": [ + "eslint:recommended", + "plugin:@typescript-eslint/recommended" + ], + "parser": "@typescript-eslint/parser", + "parserOptions": { + "ecmaVersion": 12, + "sourceType": "module" + }, + "plugins": [ + "@typescript-eslint" + ], + "rules": { + "indent": [ + "error", + 4, + { + "SwitchCase": 1 + } + ], + "no-trailing-spaces": [ + "error", + { + "skipBlankLines": false, + "ignoreComments": true + } + ], + "linebreak-style": [ + "off" + ], + "quotes": [ + "error", + "single" + ], + "semi": [ + "error", + "always" + ], + "brace-style": [ + "error", + "allman" + ], + "object-curly-spacing": [ + "error", + "always" + ], + "keyword-spacing": [ + "error", + { + "overrides": + { + "if": + { + "after": false + }, + "for": + { + "after": false + }, + "while": + { + "after": false + }, + "switch": + { + "after": false + } + } + } + ], + "@typescript-eslint/no-explicit-any": [ + "off" + ], + "@typescript-eslint/explicit-module-boundary-types": [ + "off", + { + "allowedNames": [ + "getMessageArray" + ] + } + ], + "@typescript-eslint/ban-ts-comment": [ + "off" + ], + "@typescript-eslint/no-empty-function": [ + "error", + { + "allow": [ + "functions", + "arrowFunctions", + "generatorFunctions", + "methods", + "generatorMethods", + "constructors" + ] + } + ], + "@typescript-eslint/no-unused-vars": [ + "off" + ], + "@typescript-eslint/no-inferrable-types": [ + "error", + { + "ignoreParameters": true, + "ignoreProperties": true + } + ], + "@typescript-eslint/ban-types": [ + "error", + { + "types": + { + "String": true, + "Boolean": true, + "Number": true, + "Symbol": true, + "{}": false, + "Object": false, + "object": false, + "Function": false + }, + "extendDefaults": true + } + ] + } +} diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..7b328b8 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,16 @@ +{ + "typescript.tsdk": "node_modules\\typescript\\lib", + "typescript.preferences.importModuleSpecifier": "relative", + "typescript.preferences.quoteStyle": "single", + "typescript.format.placeOpenBraceOnNewLineForControlBlocks": true, + "typescript.format.placeOpenBraceOnNewLineForFunctions": true, + "editor.codeActionsOnSave": { + "source.fixAll": true, + "source.organizeImports": true, + }, + "emmet.showExpandedAbbreviation": "never", + "git.ignoreLimitWarning": true, + "files.eol": "\n", + "files.insertFinalNewline": true, + "files.trimFinalNewlines": true +} diff --git a/package-lock.json b/package-lock.json index b639867..cf053d3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,9 +1,3928 @@ { "name": "nitroassetconverter", "version": "1.0.0", - "lockfileVersion": 1, + "lockfileVersion": 2, "requires": true, + "packages": { + "": { + "name": "nitroassetconverter", + "version": "1.0.0", + "license": "ISC", + "dependencies": { + "@gizeta/swf-reader": "^1.0.0", + "bytebuffer": "^5.0.1", + "concat-frames": "^1.0.3", + "free-tex-packer-core": "^0.3.2", + "jimp": "^0.16.1", + "jpg-stream": "^1.1.2", + "lodash": "^4.17.20", + "node-fetch": "^2.6.1", + "node-gzip": "^1.1.2", + "ora": "^5.3.0", + "png-stream": "^1.0.5", + "reflect-metadata": "^0.1.13", + "stream-to-array": "^2.3.0", + "tsyringe": "^4.4.0", + "xml2js": "^0.4.23" + }, + "devDependencies": { + "@types/bytebuffer": "^5.0.42", + "@types/node": "^14.14.28", + "@types/node-fetch": "^2.5.8", + "@types/xml2js": "^0.4.8", + "@typescript-eslint/eslint-plugin": "^4.15.1", + "@typescript-eslint/parser": "^4.15.1", + "eslint": "^7.20.0", + "ts-node": "^9.1.1", + "ts-node-dev": "^1.1.1", + "typescript": "^4.1.5" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", + "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.10.4" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", + "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", + "dev": true + }, + "node_modules/@babel/highlight": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.12.13.tgz", + "integrity": "sha512-kocDQvIbgMKlWxXe9fof3TQ+gkIPOUSEYhJjqUjvKMez3krV7vbzYCDq39Oj11UAVK7JqPVGQPlgE85dPNlQww==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.12.11", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/runtime": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.12.13.tgz", + "integrity": "sha512-8+3UMPBrjFa/6TtKi/7sehPKqfAm4g6K+YQjyyFOLUTxzOngcRZTlAVY8sc2CORJYqdHQY8gRPHmn+qo15rCBw==", + "dependencies": { + "regenerator-runtime": "^0.13.4" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.3.0.tgz", + "integrity": "sha512-1JTKgrOKAHVivSvOYw+sJOunkBjUOvjqWk1DPja7ZFhIS2mX/4EgTT8M7eTK9jrKhL/FvXXEbQwIs3pg1xp3dg==", + "dev": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.1.1", + "espree": "^7.3.0", + "globals": "^12.1.0", + "ignore": "^4.0.6", + "import-fresh": "^3.2.1", + "js-yaml": "^3.13.1", + "lodash": "^4.17.20", + "minimatch": "^3.0.4", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/@gizeta/swf-reader": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@gizeta/swf-reader/-/swf-reader-1.0.0.tgz", + "integrity": "sha1-34Huyh7J7miWax2Tbd/iH5Hp3IM=", + "dependencies": { + "lzma-purejs": "~0.9.3" + } + }, + "node_modules/@jimp/bmp": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/@jimp/bmp/-/bmp-0.16.1.tgz", + "integrity": "sha512-iwyNYQeBawrdg/f24x3pQ5rEx+/GwjZcCXd3Kgc+ZUd+Ivia7sIqBsOnDaMZdKCBPlfW364ekexnlOqyVa0NWg==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.1", + "bmp-js": "^0.1.0" + } + }, + "node_modules/@jimp/core": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/@jimp/core/-/core-0.16.1.tgz", + "integrity": "sha512-la7kQia31V6kQ4q1kI/uLimu8FXx7imWVajDGtwUG8fzePLWDFJyZl0fdIXVCL1JW2nBcRHidUot6jvlRDi2+g==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.1", + "any-base": "^1.1.0", + "buffer": "^5.2.0", + "exif-parser": "^0.1.12", + "file-type": "^9.0.0", + "load-bmfont": "^1.3.1", + "mkdirp": "^0.5.1", + "phin": "^2.9.1", + "pixelmatch": "^4.0.2", + "tinycolor2": "^1.4.1" + } + }, + "node_modules/@jimp/custom": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/@jimp/custom/-/custom-0.16.1.tgz", + "integrity": "sha512-DNUAHNSiUI/j9hmbatD6WN/EBIyeq4AO0frl5ETtt51VN1SvE4t4v83ZA/V6ikxEf3hxLju4tQ5Pc3zmZkN/3A==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/core": "^0.16.1" + } + }, + "node_modules/@jimp/gif": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/@jimp/gif/-/gif-0.16.1.tgz", + "integrity": "sha512-r/1+GzIW1D5zrP4tNrfW+3y4vqD935WBXSc8X/wm23QTY9aJO9Lw6PEdzpYCEY+SOklIFKaJYUAq/Nvgm/9ryw==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.1", + "gifwrap": "^0.9.2", + "omggif": "^1.0.9" + } + }, + "node_modules/@jimp/jpeg": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/@jimp/jpeg/-/jpeg-0.16.1.tgz", + "integrity": "sha512-8352zrdlCCLFdZ/J+JjBslDvml+fS3Z8gttdml0We759PnnZGqrnPRhkOEOJbNUlE+dD4ckLeIe6NPxlS/7U+w==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.1", + "jpeg-js": "0.4.2" + } + }, + "node_modules/@jimp/plugin-blit": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/@jimp/plugin-blit/-/plugin-blit-0.16.1.tgz", + "integrity": "sha512-fKFNARm32RoLSokJ8WZXHHH2CGzz6ire2n1Jh6u+XQLhk9TweT1DcLHIXwQMh8oR12KgjbgsMGvrMVlVknmOAg==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.1" + } + }, + "node_modules/@jimp/plugin-blur": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/@jimp/plugin-blur/-/plugin-blur-0.16.1.tgz", + "integrity": "sha512-1WhuLGGj9MypFKRcPvmW45ht7nXkOKu+lg3n2VBzIB7r4kKNVchuI59bXaCYQumOLEqVK7JdB4glaDAbCQCLyw==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.1" + } + }, + "node_modules/@jimp/plugin-circle": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/@jimp/plugin-circle/-/plugin-circle-0.16.1.tgz", + "integrity": "sha512-JK7yi1CIU7/XL8hdahjcbGA3V7c+F+Iw+mhMQhLEi7Q0tCnZ69YJBTamMiNg3fWPVfMuvWJJKOBRVpwNTuaZRg==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.1" + } + }, + "node_modules/@jimp/plugin-color": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/@jimp/plugin-color/-/plugin-color-0.16.1.tgz", + "integrity": "sha512-9yQttBAO5SEFj7S6nJK54f+1BnuBG4c28q+iyzm1JjtnehjqMg6Ljw4gCSDCvoCQ3jBSYHN66pmwTV74SU1B7A==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.1", + "tinycolor2": "^1.4.1" + } + }, + "node_modules/@jimp/plugin-contain": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/@jimp/plugin-contain/-/plugin-contain-0.16.1.tgz", + "integrity": "sha512-44F3dUIjBDHN+Ym/vEfg+jtjMjAqd2uw9nssN67/n4FdpuZUVs7E7wadKY1RRNuJO+WgcD5aDQcsvurXMETQTg==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.1" + } + }, + "node_modules/@jimp/plugin-cover": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/@jimp/plugin-cover/-/plugin-cover-0.16.1.tgz", + "integrity": "sha512-YztWCIldBAVo0zxcQXR+a/uk3/TtYnpKU2CanOPJ7baIuDlWPsG+YE4xTsswZZc12H9Kl7CiziEbDtvF9kwA/Q==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.1" + } + }, + "node_modules/@jimp/plugin-crop": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/@jimp/plugin-crop/-/plugin-crop-0.16.1.tgz", + "integrity": "sha512-UQdva9oQzCVadkyo3T5Tv2CUZbf0klm2cD4cWMlASuTOYgaGaFHhT9st+kmfvXjKL8q3STkBu/zUPV6PbuV3ew==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.1" + } + }, + "node_modules/@jimp/plugin-displace": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/@jimp/plugin-displace/-/plugin-displace-0.16.1.tgz", + "integrity": "sha512-iVAWuz2+G6Heu8gVZksUz+4hQYpR4R0R/RtBzpWEl8ItBe7O6QjORAkhxzg+WdYLL2A/Yd4ekTpvK0/qW8hTVw==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.1" + } + }, + "node_modules/@jimp/plugin-dither": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/@jimp/plugin-dither/-/plugin-dither-0.16.1.tgz", + "integrity": "sha512-tADKVd+HDC9EhJRUDwMvzBXPz4GLoU6s5P7xkVq46tskExYSptgj5713J5Thj3NMgH9Rsqu22jNg1H/7tr3V9Q==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.1" + } + }, + "node_modules/@jimp/plugin-fisheye": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/@jimp/plugin-fisheye/-/plugin-fisheye-0.16.1.tgz", + "integrity": "sha512-BWHnc5hVobviTyIRHhIy9VxI1ACf4CeSuCfURB6JZm87YuyvgQh5aX5UDKtOz/3haMHXBLP61ZBxlNpMD8CG4A==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.1" + } + }, + "node_modules/@jimp/plugin-flip": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/@jimp/plugin-flip/-/plugin-flip-0.16.1.tgz", + "integrity": "sha512-KdxTf0zErfZ8DyHkImDTnQBuHby+a5YFdoKI/G3GpBl3qxLBvC+PWkS2F/iN3H7wszP7/TKxTEvWL927pypT0w==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.1" + } + }, + "node_modules/@jimp/plugin-gaussian": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/@jimp/plugin-gaussian/-/plugin-gaussian-0.16.1.tgz", + "integrity": "sha512-u9n4wjskh3N1mSqketbL6tVcLU2S5TEaFPR40K6TDv4phPLZALi1Of7reUmYpVm8mBDHt1I6kGhuCJiWvzfGyg==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.1" + } + }, + "node_modules/@jimp/plugin-invert": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/@jimp/plugin-invert/-/plugin-invert-0.16.1.tgz", + "integrity": "sha512-2DKuyVXANH8WDpW9NG+PYFbehzJfweZszFYyxcaewaPLN0GxvxVLOGOPP1NuUTcHkOdMFbE0nHDuB7f+sYF/2w==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.1" + } + }, + "node_modules/@jimp/plugin-mask": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/@jimp/plugin-mask/-/plugin-mask-0.16.1.tgz", + "integrity": "sha512-snfiqHlVuj4bSFS0v96vo2PpqCDMe4JB+O++sMo5jF5mvGcGL6AIeLo8cYqPNpdO6BZpBJ8MY5El0Veckhr39Q==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.1" + } + }, + "node_modules/@jimp/plugin-normalize": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/@jimp/plugin-normalize/-/plugin-normalize-0.16.1.tgz", + "integrity": "sha512-dOQfIOvGLKDKXPU8xXWzaUeB0nvkosHw6Xg1WhS1Z5Q0PazByhaxOQkSKgUryNN/H+X7UdbDvlyh/yHf3ITRaw==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.1" + } + }, + "node_modules/@jimp/plugin-print": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/@jimp/plugin-print/-/plugin-print-0.16.1.tgz", + "integrity": "sha512-ceWgYN40jbN4cWRxixym+csyVymvrryuKBQ+zoIvN5iE6OyS+2d7Mn4zlNgumSczb9GGyZZESIgVcBDA1ezq0Q==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.1", + "load-bmfont": "^1.4.0" + } + }, + "node_modules/@jimp/plugin-resize": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/@jimp/plugin-resize/-/plugin-resize-0.16.1.tgz", + "integrity": "sha512-u4JBLdRI7dargC04p2Ha24kofQBk3vhaf0q8FwSYgnCRwxfvh2RxvhJZk9H7Q91JZp6wgjz/SjvEAYjGCEgAwQ==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.1" + } + }, + "node_modules/@jimp/plugin-rotate": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/@jimp/plugin-rotate/-/plugin-rotate-0.16.1.tgz", + "integrity": "sha512-ZUU415gDQ0VjYutmVgAYYxC9Og9ixu2jAGMCU54mSMfuIlmohYfwARQmI7h4QB84M76c9hVLdONWjuo+rip/zg==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.1" + } + }, + "node_modules/@jimp/plugin-scale": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/@jimp/plugin-scale/-/plugin-scale-0.16.1.tgz", + "integrity": "sha512-jM2QlgThIDIc4rcyughD5O7sOYezxdafg/2Xtd1csfK3z6fba3asxDwthqPZAgitrLgiKBDp6XfzC07Y/CefUw==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.1" + } + }, + "node_modules/@jimp/plugin-shadow": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/@jimp/plugin-shadow/-/plugin-shadow-0.16.1.tgz", + "integrity": "sha512-MeD2Is17oKzXLnsphAa1sDstTu6nxscugxAEk3ji0GV1FohCvpHBcec0nAq6/czg4WzqfDts+fcPfC79qWmqrA==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.1" + } + }, + "node_modules/@jimp/plugin-threshold": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/@jimp/plugin-threshold/-/plugin-threshold-0.16.1.tgz", + "integrity": "sha512-iGW8U/wiCSR0+6syrPioVGoSzQFt4Z91SsCRbgNKTAk7D+XQv6OI78jvvYg4o0c2FOlwGhqz147HZV5utoSLxA==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.1" + } + }, + "node_modules/@jimp/plugins": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/@jimp/plugins/-/plugins-0.16.1.tgz", + "integrity": "sha512-c+lCqa25b+4q6mJZSetlxhMoYuiltyS+ValLzdwK/47+aYsq+kcJNl+TuxIEKf59yr9+5rkbpsPkZHLF/V7FFA==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/plugin-blit": "^0.16.1", + "@jimp/plugin-blur": "^0.16.1", + "@jimp/plugin-circle": "^0.16.1", + "@jimp/plugin-color": "^0.16.1", + "@jimp/plugin-contain": "^0.16.1", + "@jimp/plugin-cover": "^0.16.1", + "@jimp/plugin-crop": "^0.16.1", + "@jimp/plugin-displace": "^0.16.1", + "@jimp/plugin-dither": "^0.16.1", + "@jimp/plugin-fisheye": "^0.16.1", + "@jimp/plugin-flip": "^0.16.1", + "@jimp/plugin-gaussian": "^0.16.1", + "@jimp/plugin-invert": "^0.16.1", + "@jimp/plugin-mask": "^0.16.1", + "@jimp/plugin-normalize": "^0.16.1", + "@jimp/plugin-print": "^0.16.1", + "@jimp/plugin-resize": "^0.16.1", + "@jimp/plugin-rotate": "^0.16.1", + "@jimp/plugin-scale": "^0.16.1", + "@jimp/plugin-shadow": "^0.16.1", + "@jimp/plugin-threshold": "^0.16.1", + "timm": "^1.6.1" + } + }, + "node_modules/@jimp/png": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/@jimp/png/-/png-0.16.1.tgz", + "integrity": "sha512-iyWoCxEBTW0OUWWn6SveD4LePW89kO7ZOy5sCfYeDM/oTPLpR8iMIGvZpZUz1b8kvzFr27vPst4E5rJhGjwsdw==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.1", + "pngjs": "^3.3.3" + } + }, + "node_modules/@jimp/tiff": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/@jimp/tiff/-/tiff-0.16.1.tgz", + "integrity": "sha512-3K3+xpJS79RmSkAvFMgqY5dhSB+/sxhwTFA9f4AVHUK0oKW+u6r52Z1L0tMXHnpbAdR9EJ+xaAl2D4x19XShkQ==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "utif": "^2.0.1" + } + }, + "node_modules/@jimp/types": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/@jimp/types/-/types-0.16.1.tgz", + "integrity": "sha512-g1w/+NfWqiVW4CaXSJyD28JQqZtm2eyKMWPhBBDCJN9nLCN12/Az0WFF3JUAktzdsEC2KRN2AqB1a2oMZBNgSQ==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/bmp": "^0.16.1", + "@jimp/gif": "^0.16.1", + "@jimp/jpeg": "^0.16.1", + "@jimp/png": "^0.16.1", + "@jimp/tiff": "^0.16.1", + "timm": "^1.6.1" + } + }, + "node_modules/@jimp/utils": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/@jimp/utils/-/utils-0.16.1.tgz", + "integrity": "sha512-8fULQjB0x4LzUSiSYG6ZtQl355sZjxbv8r9PPAuYHzS9sGiSHJQavNqK/nKnpDsVkU88/vRGcE7t3nMU0dEnVw==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "regenerator-runtime": "^0.13.3" + } + }, + "node_modules/@jvitela/mustache-wax": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@jvitela/mustache-wax/-/mustache-wax-1.0.3.tgz", + "integrity": "sha512-5M5p8d9YQwEDSa0oLoeCZ8ECiM2ZJLKxI/D0pDByiNBJw+4Tizjk/NMIjGx7IoJOGBnWcfHX3Pwd6m/MpMHoGA==" + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.4.tgz", + "integrity": "sha512-33g3pMJk3bg5nXbL/+CY6I2eJDzZAni49PfJnL5fghPTggPvBd/pFNSgJsdAgWptuFu7qq/ERvOYFlhvsLTCKA==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.4", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.4.tgz", + "integrity": "sha512-IYlHJA0clt2+Vg7bccq+TzRdJvv19c2INqBSsoOLp1je7xjtr7J26+WXR72MCdvU9q1qTzIWDfhMf+DRvQJK4Q==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.6.tgz", + "integrity": "sha512-8Broas6vTtW4GIXTAHDoE32hnN2M5ykgCpWGbuXHQ15vEMqr23pB76e/GZcYsZCHALv50ktd24qhEyKr6wBtow==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.4", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@types/bytebuffer": { + "version": "5.0.42", + "resolved": "https://registry.npmjs.org/@types/bytebuffer/-/bytebuffer-5.0.42.tgz", + "integrity": "sha512-lEgKojWUAc/MG2t649oZS5AfYFP2xRNPoDuwDBlBMjHXd8MaGPgFgtCXUK7inZdBOygmVf10qxc1Us8GXC96aw==", + "dev": true, + "dependencies": { + "@types/long": "*", + "@types/node": "*" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.7", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.7.tgz", + "integrity": "sha512-cxWFQVseBm6O9Gbw1IWb8r6OS4OhSt3hPZLkFApLjM8TEXROBuQGLAH2i2gZpcXdLBIrpXuTDhH7Vbm1iXmNGA==", + "dev": true + }, + "node_modules/@types/long": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.1.tgz", + "integrity": "sha512-5tXH6Bx/kNGd3MgffdmP4dy2Z+G4eaXw0SE81Tq3BNadtnMR5/ySMzX4SLEzHJzSmPNn4HIdpQsBvXMUykr58w==", + "dev": true + }, + "node_modules/@types/node": { + "version": "14.14.28", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.28.tgz", + "integrity": "sha512-lg55ArB+ZiHHbBBttLpzD07akz0QPrZgUODNakeC09i62dnrywr9mFErHuaPlB6I7z+sEbK+IYmplahvplCj2g==", + "dev": true + }, + "node_modules/@types/node-fetch": { + "version": "2.5.8", + "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.5.8.tgz", + "integrity": "sha512-fbjI6ja0N5ZA8TV53RUqzsKNkl9fv8Oj3T7zxW7FGv1GSH7gwJaNF8dzCjrqKaxKeUpTz4yT1DaJFq/omNpGfw==", + "dev": true, + "dependencies": { + "@types/node": "*", + "form-data": "^3.0.0" + } + }, + "node_modules/@types/node-fetch/node_modules/form-data": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", + "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", + "dev": true, + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@types/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-FKjsOVbC6B7bdSB5CuzyHCkK69I=", + "dev": true + }, + "node_modules/@types/strip-json-comments": { + "version": "0.0.30", + "resolved": "https://registry.npmjs.org/@types/strip-json-comments/-/strip-json-comments-0.0.30.tgz", + "integrity": "sha512-7NQmHra/JILCd1QqpSzl8+mJRc8ZHz3uDm8YV1Ks9IhK0epEiTw8aIErbvH9PI+6XbqhyIQy3462nEsn7UVzjQ==", + "dev": true + }, + "node_modules/@types/xml2js": { + "version": "0.4.8", + "resolved": "https://registry.npmjs.org/@types/xml2js/-/xml2js-0.4.8.tgz", + "integrity": "sha512-EyvT83ezOdec7BhDaEcsklWy7RSIdi6CNe95tmOAK0yx/Lm30C9K75snT3fYayK59ApC2oyW+rcHErdG05FHJA==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "4.15.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.15.1.tgz", + "integrity": "sha512-yW2epMYZSpNJXZy22Biu+fLdTG8Mn6b22kR3TqblVk50HGNV8Zya15WAXuQCr8tKw4Qf1BL4QtI6kv6PCkLoJw==", + "dev": true, + "dependencies": { + "@typescript-eslint/experimental-utils": "4.15.1", + "@typescript-eslint/scope-manager": "4.15.1", + "debug": "^4.1.1", + "functional-red-black-tree": "^1.0.1", + "lodash": "^4.17.15", + "regexpp": "^3.0.0", + "semver": "^7.3.2", + "tsutils": "^3.17.1" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/@typescript-eslint/experimental-utils": { + "version": "4.15.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.15.1.tgz", + "integrity": "sha512-9LQRmOzBRI1iOdJorr4jEnQhadxK4c9R2aEAsm7WE/7dq8wkKD1suaV0S/JucTL8QlYUPU1y2yjqg+aGC0IQBQ==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.3", + "@typescript-eslint/scope-manager": "4.15.1", + "@typescript-eslint/types": "4.15.1", + "@typescript-eslint/typescript-estree": "4.15.1", + "eslint-scope": "^5.0.0", + "eslint-utils": "^2.0.0" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "4.15.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.15.1.tgz", + "integrity": "sha512-V8eXYxNJ9QmXi5ETDguB7O9diAXlIyS+e3xzLoP/oVE4WCAjssxLIa0mqCLsCGXulYJUfT+GV70Jv1vHsdKwtA==", + "dev": true, + "dependencies": { + "@typescript-eslint/scope-manager": "4.15.1", + "@typescript-eslint/types": "4.15.1", + "@typescript-eslint/typescript-estree": "4.15.1", + "debug": "^4.1.1" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "4.15.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.15.1.tgz", + "integrity": "sha512-ibQrTFcAm7yG4C1iwpIYK7vDnFg+fKaZVfvyOm3sNsGAerKfwPVFtYft5EbjzByDJ4dj1WD8/34REJfw/9wdVA==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "4.15.1", + "@typescript-eslint/visitor-keys": "4.15.1" + }, + "engines": { + "node": "^8.10.0 || ^10.13.0 || >=11.10.1" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "4.15.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.15.1.tgz", + "integrity": "sha512-iGsaUyWFyLz0mHfXhX4zO6P7O3sExQpBJ2dgXB0G5g/8PRVfBBsmQIc3r83ranEQTALLR3Vko/fnCIVqmH+mPw==", + "dev": true, + "engines": { + "node": "^8.10.0 || ^10.13.0 || >=11.10.1" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "4.15.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.15.1.tgz", + "integrity": "sha512-z8MN3CicTEumrWAEB2e2CcoZa3KP9+SMYLIA2aM49XW3cWIaiVSOAGq30ffR5XHxRirqE90fgLw3e6WmNx5uNw==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "4.15.1", + "@typescript-eslint/visitor-keys": "4.15.1", + "debug": "^4.1.1", + "globby": "^11.0.1", + "is-glob": "^4.0.1", + "semver": "^7.3.2", + "tsutils": "^3.17.1" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "4.15.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.15.1.tgz", + "integrity": "sha512-tYzaTP9plooRJY8eNlpAewTOqtWW/4ff/5wBjNVaJ0S0wC4Gpq/zDVRTJa5bq2v1pCNQ08xxMCndcvR+h7lMww==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "4.15.1", + "eslint-visitor-keys": "^2.0.0" + }, + "engines": { + "node": "^8.10.0 || ^10.13.0 || >=11.10.1" + } + }, + "node_modules/acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz", + "integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==", + "dev": true + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "node_modules/amdefine": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-0.1.1.tgz", + "integrity": "sha1-tcdcUyBS3M1qOcAGTHcsjVegbNI=", + "engines": { + "node": ">=0.4.2" + } + }, + "node_modules/ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/any-base": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/any-base/-/any-base-1.1.0.tgz", + "integrity": "sha512-uMgjozySS8adZZYePpaWs8cxB9/kdzmpX6SgJZ+wbz1K5eYk5QMYDVJaZKhxyIHUdnnJkfR7SVgStgH7LkGUyg==" + }, + "node_modules/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8=" + }, + "node_modules/anymatch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", + "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/array-find-index": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", + "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/asn1": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "dependencies": { + "safer-buffer": "~2.1.0" + } + }, + "node_modules/assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + }, + "node_modules/aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "engines": { + "node": "*" + } + }, + "node_modules/aws4": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", + "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==" + }, + "node_modules/balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" + }, + "node_modules/bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "dependencies": { + "tweetnacl": "^0.14.3" + } + }, + "node_modules/bignumber.js": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-2.4.0.tgz", + "integrity": "sha1-g4qZLan51zfg9LLbC+YrsJ3Qxeg=", + "engines": { + "node": "*" + } + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/bl": { + "version": "0.9.5", + "resolved": "https://registry.npmjs.org/bl/-/bl-0.9.5.tgz", + "integrity": "sha1-wGt5evCF6gC8Unr8jvzxHeIjIFQ=", + "dependencies": { + "readable-stream": "~1.0.26" + } + }, + "node_modules/bmp-js": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/bmp-js/-/bmp-js-0.1.0.tgz", + "integrity": "sha1-4Fpj95amwf8l9Hcex62twUjAcjM=" + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", + "engines": { + "node": "*" + } + }, + "node_modules/buffer-equal": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-0.0.1.tgz", + "integrity": "sha1-kbx0sR6kBbyRa8aqkI+q+ltKrEs=", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", + "dev": true + }, + "node_modules/bytebuffer": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/bytebuffer/-/bytebuffer-5.0.1.tgz", + "integrity": "sha1-WC7qSxqHO20CCkjVjfhfC7ps/d0=", + "dependencies": { + "long": "~3" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", + "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/camelcase-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", + "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", + "dev": true, + "dependencies": { + "camelcase": "^2.0.0", + "map-obj": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" + }, + "node_modules/chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/chalk/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/chalk/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/chalk/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/chalk/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/chalk/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/chokidar": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz", + "integrity": "sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==", + "dev": true, + "dependencies": { + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.5.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.1" + } + }, + "node_modules/cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-spinners": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.5.0.tgz", + "integrity": "sha512-PC+AmIuK04E6aeSs/pUccSujsTzBhu4HzC2dL+CfJB/Jcc2qTRbEwZQDfIUpt2Xl8BodYBEq8w4fc0kU2I9DjQ==", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commander": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.0.0.tgz", + "integrity": "sha1-0bhvkB+LZL2UG96tr5JFMDk76Sg=", + "engines": { + "node": ">= 0.6.x" + } + }, + "node_modules/concat-frames": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/concat-frames/-/concat-frames-1.0.3.tgz", + "integrity": "sha1-z+moFvJce3WWPZn+8vSqBFj7+Zs=", + "dependencies": { + "pixel-stream": "^1.0.3" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "node_modules/core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/currently-unhandled": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", + "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", + "dev": true, + "dependencies": { + "array-find-index": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "dependencies": { + "assert-plus": "^1.0.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/dateformat": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-1.0.12.tgz", + "integrity": "sha1-nxJLZ1lMk3/3BpMuSmQsyo27/uk=", + "dev": true, + "dependencies": { + "get-stdin": "^4.0.1", + "meow": "^3.3.0" + }, + "bin": { + "dateformat": "bin/cli.js" + }, + "engines": { + "node": "*" + } + }, + "node_modules/debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "dev": true + }, + "node_modules/defaults": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", + "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", + "dependencies": { + "clone": "^1.0.2" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/dom-walk": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.2.tgz", + "integrity": "sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==" + }, + "node_modules/dynamic-dedupe": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/dynamic-dedupe/-/dynamic-dedupe-0.3.0.tgz", + "integrity": "sha1-BuRMIj9eTpTXjvnbI6ZRXOL5YqE=", + "dev": true, + "dependencies": { + "xtend": "^4.0.0" + } + }, + "node_modules/ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "dependencies": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/enquirer": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", + "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", + "dev": true, + "dependencies": { + "ansi-colors": "^4.1.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es6-promise": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.3.1.tgz", + "integrity": "sha1-oIzd6EzNvzTQJ6FFG8kdS80ophM=" + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/eslint": { + "version": "7.20.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.20.0.tgz", + "integrity": "sha512-qGi0CTcOGP2OtCQBgWZlQjcTuP0XkIpYFj25XtRTQSHC+umNnp7UMshr2G8SLsRFYDdAPFeHOsiteadmMH02Yw==", + "dev": true, + "dependencies": { + "@babel/code-frame": "7.12.11", + "@eslint/eslintrc": "^0.3.0", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "enquirer": "^2.3.5", + "eslint-scope": "^5.1.1", + "eslint-utils": "^2.1.0", + "eslint-visitor-keys": "^2.0.0", + "espree": "^7.3.1", + "esquery": "^1.4.0", + "esutils": "^2.0.2", + "file-entry-cache": "^6.0.0", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^5.0.0", + "globals": "^12.1.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "js-yaml": "^3.13.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash": "^4.17.20", + "minimatch": "^3.0.4", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "progress": "^2.0.0", + "regexpp": "^3.1.0", + "semver": "^7.2.1", + "strip-ansi": "^6.0.0", + "strip-json-comments": "^3.1.0", + "table": "^6.0.4", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/eslint-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^1.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz", + "integrity": "sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/espree": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", + "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", + "dev": true, + "dependencies": { + "acorn": "^7.4.0", + "acorn-jsx": "^5.3.1", + "eslint-visitor-keys": "^1.3.0" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/espree/node_modules/eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esquery": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", + "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "dev": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esquery/node_modules/estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/exif-parser": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/exif-parser/-/exif-parser-0.1.12.tgz", + "integrity": "sha1-WKnS1ywCwfbwKg70qRZicrd2CSI=" + }, + "node_modules/exif-reader": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/exif-reader/-/exif-reader-1.0.3.tgz", + "integrity": "sha512-tWMBj1+9jUSibgR/kv/GQ/fkR0biaN9GEZ5iPdf7jFeH//d2bSzgPoaWf1OfMv4MXFD4upwvpCCyeMvSyLWSfA==" + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "node_modules/extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "engines": [ + "node >=0.6.0" + ] + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "node_modules/fast-glob": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.5.tgz", + "integrity": "sha512-2DtFcgT68wiTTiwZ2hNdJfcHNke9XOfnwmBRWXhmeKM8rF0TGwmC/Qto3S7RoZKp5cilZbxzO5iTNTQsJ+EeDg==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.0", + "merge2": "^1.3.0", + "micromatch": "^4.0.2", + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, + "node_modules/fastq": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.10.1.tgz", + "integrity": "sha512-AWuv6Ery3pM+dY7LYS8YIaCiQvUaos9OB1RyNgaOWnaX+Tik7Onvcsf8x8c+YtDeT0maYLniBip2hox5KtEXXA==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.0.tgz", + "integrity": "sha512-fqoO76jZ3ZnYrXLDRxBR1YvOvc0k844kcOg40bgsPrE25LAb/PDqTY+ho64Xh2c8ZXgIKldchCFHczG2UVRcWA==", + "dev": true, + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/file-type": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-9.0.0.tgz", + "integrity": "sha512-Qe/5NJrgIOlwijpq3B7BEpzPFcgzggOTagZmkXQY4LA6bsXKTUstK7Wp12lEJ/mLKTpvIZxmIuRcLYWT6ov9lw==", + "engines": { + "node": ">=6" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true, + "dependencies": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "dev": true, + "dependencies": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.1.1.tgz", + "integrity": "sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA==", + "dev": true + }, + "node_modules/forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "engines": { + "node": "*" + } + }, + "node_modules/form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 0.12" + } + }, + "node_modules/free-tex-packer-core": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/free-tex-packer-core/-/free-tex-packer-core-0.3.2.tgz", + "integrity": "sha512-CauShorQ77Pgm+u2YalXX6HyR0rnkuccS3lIKCZpnBeAjcUV6SXCwswUGS8cbrvS5/dIwM5UeqFu02X86PPMkg==", + "dependencies": { + "@jvitela/mustache-wax": "^1.0.1", + "jimp": "^0.2.28", + "maxrects-packer": "^2.5.0", + "mustache": "^2.3.0", + "tinify": "^1.5.0" + } + }, + "node_modules/free-tex-packer-core/node_modules/bmp-js": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/bmp-js/-/bmp-js-0.0.3.tgz", + "integrity": "sha1-ZBE+nHzxICs3btYHvzBibr5XsYo=" + }, + "node_modules/free-tex-packer-core/node_modules/file-type": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz", + "integrity": "sha1-JXoHg4TR24CHvESdEH1SpSZyuek=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/free-tex-packer-core/node_modules/jimp": { + "version": "0.2.28", + "resolved": "https://registry.npmjs.org/jimp/-/jimp-0.2.28.tgz", + "integrity": "sha1-3VKak3GQ9ClXp5N9Gsw6d2KZbqI=", + "dependencies": { + "bignumber.js": "^2.1.0", + "bmp-js": "0.0.3", + "es6-promise": "^3.0.2", + "exif-parser": "^0.1.9", + "file-type": "^3.1.0", + "jpeg-js": "^0.2.0", + "load-bmfont": "^1.2.3", + "mime": "^1.3.4", + "mkdirp": "0.5.1", + "pixelmatch": "^4.0.0", + "pngjs": "^3.0.0", + "read-chunk": "^1.0.1", + "request": "^2.65.0", + "stream-to-buffer": "^0.1.0", + "tinycolor2": "^1.1.2", + "url-regex": "^3.0.0" + } + }, + "node_modules/free-tex-packer-core/node_modules/jpeg-js": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/jpeg-js/-/jpeg-js-0.2.0.tgz", + "integrity": "sha1-U+RI7J0mPmgyZkZ+lELSxaLvVII=" + }, + "node_modules/free-tex-packer-core/node_modules/minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" + }, + "node_modules/free-tex-packer-core/node_modules/mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dependencies": { + "minimist": "0.0.8" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "node_modules/functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "dev": true + }, + "node_modules/get-stdin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", + "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "dependencies": { + "assert-plus": "^1.0.0" + } + }, + "node_modules/gifwrap": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/gifwrap/-/gifwrap-0.9.2.tgz", + "integrity": "sha512-fcIswrPaiCDAyO8xnWvHSZdWChjKXUanKKpAiWWJ/UTkEi/aYKn5+90e7DE820zbEaVR9CE2y4z9bzhQijZ0BA==", + "dependencies": { + "image-q": "^1.1.1", + "omggif": "^1.0.10" + } + }, + "node_modules/glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + } + }, + "node_modules/glob-parent": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", + "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/global": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/global/-/global-4.4.0.tgz", + "integrity": "sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==", + "dependencies": { + "min-document": "^2.19.0", + "process": "^0.11.10" + } + }, + "node_modules/globals": { + "version": "12.4.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", + "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", + "dev": true, + "dependencies": { + "type-fest": "^0.8.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/globby": { + "version": "11.0.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.2.tgz", + "integrity": "sha512-2ZThXDvvV8fYFRVIxnrMQBipZQDr7MxKAmQK1vujaj9/7eF0efG7BPUKJ7jP7G5SLF37xKDXvO4S/KKLj/Z0og==", + "dev": true, + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.1.1", + "ignore": "^5.1.4", + "merge2": "^1.3.0", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/globby/node_modules/ignore": { + "version": "5.1.8", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", + "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", + "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==", + "dev": true + }, + "node_modules/har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "engines": { + "node": ">=4" + } + }, + "node_modules/har-validator": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", + "dependencies": { + "ajv": "^6.12.3", + "har-schema": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/hosted-git-info": { + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", + "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==", + "dev": true + }, + "node_modules/http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "dependencies": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + }, + "engines": { + "node": ">=0.8", + "npm": ">=1.3.7" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" + }, + "node_modules/ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/image-q": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/image-q/-/image-q-1.1.1.tgz", + "integrity": "sha1-/IQJlmRGC5DKhi2TALa/u7+/gFY=", + "engines": { + "node": ">=0.9.0" + } + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indent-string": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", + "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", + "dev": true, + "dependencies": { + "repeating": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/ip-regex": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-1.0.3.tgz", + "integrity": "sha1-3FiQdvZZ9BnCIgOaMzFvHHOH7/0=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-core-module": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.2.0.tgz", + "integrity": "sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-finite": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz", + "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==", + "dev": true, + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-function": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-function/-/is-function-1.0.2.tgz", + "integrity": "sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ==" + }, + "node_modules/is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-interactive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", + "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" + }, + "node_modules/is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", + "dev": true + }, + "node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "node_modules/isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" + }, + "node_modules/jimp": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/jimp/-/jimp-0.16.1.tgz", + "integrity": "sha512-+EKVxbR36Td7Hfd23wKGIeEyHbxShZDX6L8uJkgVW3ESA9GiTEPK08tG1XI2r/0w5Ch0HyJF5kPqF9K7EmGjaw==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/custom": "^0.16.1", + "@jimp/plugins": "^0.16.1", + "@jimp/types": "^0.16.1", + "regenerator-runtime": "^0.13.3" + } + }, + "node_modules/jpeg-js": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/jpeg-js/-/jpeg-js-0.4.2.tgz", + "integrity": "sha512-+az2gi/hvex7eLTMTlbRLOhH6P6WFdk2ITI8HJsaH2VqYO0I594zXSYEP+tf4FW+8Cy68ScDXoAsQdyQanv3sw==" + }, + "node_modules/jpg-stream": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/jpg-stream/-/jpg-stream-1.1.2.tgz", + "integrity": "sha1-TboVnZ0ZNo3yExj2SM7pgKcr5Ac=", + "dependencies": { + "exif-reader": "^1.0.0", + "pixel-stream": "^1.0.3" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" + }, + "node_modules/json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true + }, + "node_modules/json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" + }, + "node_modules/jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "engines": [ + "node >=0.6.0" + ], + "dependencies": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/load-bmfont": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/load-bmfont/-/load-bmfont-1.4.1.tgz", + "integrity": "sha512-8UyQoYmdRDy81Brz6aLAUhfZLwr5zV0L3taTQ4hju7m6biuwiWiJXjPhBJxbUQJA8PrkvJ/7Enqmwk2sM14soA==", + "dependencies": { + "buffer-equal": "0.0.1", + "mime": "^1.3.4", + "parse-bmfont-ascii": "^1.0.3", + "parse-bmfont-binary": "^1.0.5", + "parse-bmfont-xml": "^1.1.4", + "phin": "^2.9.1", + "xhr": "^2.0.1", + "xtend": "^4.0.0" + } + }, + "node_modules/load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/lodash": { + "version": "4.17.20", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", + "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==" + }, + "node_modules/log-symbols": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.0.0.tgz", + "integrity": "sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA==", + "dependencies": { + "chalk": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/long": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/long/-/long-3.2.0.tgz", + "integrity": "sha1-2CG3E4yhy1gcFymQ7xTbIAtcR0s=", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/loud-rejection": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", + "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", + "dev": true, + "dependencies": { + "currently-unhandled": "^0.4.1", + "signal-exit": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/lzma-purejs": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/lzma-purejs/-/lzma-purejs-0.9.3.tgz", + "integrity": "sha1-yJF+iUsbTbXIZbkn34ZO3edZzN4=", + "dependencies": { + "amdefine": "~0.1.0", + "commander": "~2.0.0" + }, + "bin": { + "lzmajs": "bin/lzmajs" + } + }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, + "node_modules/map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/maxrects-packer": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/maxrects-packer/-/maxrects-packer-2.7.2.tgz", + "integrity": "sha512-akd5IRLPqQeWlpJyRJyfYq86VB05zzbMIdyTgLxRk4z1H0A8g4oTJW31Yo6zO9piSRsFNYdzmgudW7J2g1gEhQ==" + }, + "node_modules/meow": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", + "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", + "dev": true, + "dependencies": { + "camelcase-keys": "^2.0.0", + "decamelize": "^1.1.2", + "loud-rejection": "^1.0.0", + "map-obj": "^1.0.1", + "minimist": "^1.1.3", + "normalize-package-data": "^2.3.4", + "object-assign": "^4.0.1", + "read-pkg-up": "^1.0.1", + "redent": "^1.0.0", + "trim-newlines": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", + "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "dev": true, + "dependencies": { + "braces": "^3.0.1", + "picomatch": "^2.0.5" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.45.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.45.0.tgz", + "integrity": "sha512-CkqLUxUk15hofLoLyljJSrukZi8mAtgd+yE5uO4tqRZsdsAJKv0O+rFMhVDRJgozy+yG6md5KwuXhD4ocIoP+w==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.28", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.28.tgz", + "integrity": "sha512-0TO2yJ5YHYr7M2zzT7gDU1tbwHxEUWBCLt0lscSNpcdAfFyJOVEpRYNS7EXVcTLNj/25QO8gulHC5JtTzSE2UQ==", + "dependencies": { + "mime-db": "1.45.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/min-document": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz", + "integrity": "sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU=", + "dependencies": { + "dom-walk": "^0.1.0" + } + }, + "node_modules/minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" + }, + "node_modules/mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dependencies": { + "minimist": "^1.2.5" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/mustache": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/mustache/-/mustache-2.3.2.tgz", + "integrity": "sha512-KpMNwdQsYz3O/SBS1qJ/o3sqUJ5wSb8gb0pul8CO0S56b9Y2ALm8zCfsjPXsqGFfoNBkDwZuZIAjhsZI03gYVQ==", + "bin": { + "mustache": "bin/mustache" + }, + "engines": { + "npm": ">=1.4.0" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true + }, + "node_modules/node-fetch": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", + "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==", + "engines": { + "node": "4.x || >=6.0.0" + } + }, + "node_modules/node-gzip": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/node-gzip/-/node-gzip-1.1.2.tgz", + "integrity": "sha512-ZB6zWpfZHGtxZnPMrJSKHVPrRjURoUzaDbLFj3VO70mpLTW5np96vXyHwft4Id0o+PYIzgDkBUjIzaNHhQ8srw==" + }, + "node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/normalize-package-data/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "engines": { + "node": "*" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/omggif": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/omggif/-/omggif-1.0.10.tgz", + "integrity": "sha512-LMJTtvgc/nugXj0Vcrrs68Mn2D1r0zf630VNtqtpI1FEO7e+O9FP4gqs9AcnBaSEeoHIPm28u6qgPR0oyEpGSw==" + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/optionator": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "dev": true, + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/ora": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.3.0.tgz", + "integrity": "sha512-zAKMgGXUim0Jyd6CXK9lraBnD3H5yPGBPPOkC23a2BG6hsm4Zu6OQSjQuEtV0BHDf4aKHcUFvJiGRrFuW3MG8g==", + "dependencies": { + "bl": "^4.0.3", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "log-symbols": "^4.0.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora/node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/ora/node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/ora/node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-bmfont-ascii": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/parse-bmfont-ascii/-/parse-bmfont-ascii-1.0.6.tgz", + "integrity": "sha1-Eaw8P/WPfCAgqyJ2kHkQjU36AoU=" + }, + "node_modules/parse-bmfont-binary": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/parse-bmfont-binary/-/parse-bmfont-binary-1.0.6.tgz", + "integrity": "sha1-0Di0dtPp3Z2x4RoLDlOiJ5K2kAY=" + }, + "node_modules/parse-bmfont-xml": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/parse-bmfont-xml/-/parse-bmfont-xml-1.1.4.tgz", + "integrity": "sha512-bjnliEOmGv3y1aMEfREMBJ9tfL3WR0i0CKPj61DnSLaoxWR3nLrsQrEbCId/8rF4NyRF0cCqisSVXyQYWM+mCQ==", + "dependencies": { + "xml-parse-from-string": "^1.0.0", + "xml2js": "^0.4.5" + } + }, + "node_modules/parse-headers": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/parse-headers/-/parse-headers-2.0.3.tgz", + "integrity": "sha512-QhhZ+DCCit2Coi2vmAKbq5RGTRcQUOE2+REgv8vdyu7MnYx2eZztegqtTx99TZ86GTIwqiy3+4nQTWZ2tgmdCA==" + }, + "node_modules/parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "dev": true, + "dependencies": { + "error-ex": "^1.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "dev": true, + "dependencies": { + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", + "dev": true + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" + }, + "node_modules/phin": { + "version": "2.9.3", + "resolved": "https://registry.npmjs.org/phin/-/phin-2.9.3.tgz", + "integrity": "sha512-CzFr90qM24ju5f88quFC/6qohjC144rehe5n6DH900lgXmUe86+xCKc10ev56gRKC4/BkHUoG4uSiQgBiIXwDA==" + }, + "node_modules/picomatch": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", + "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", + "dev": true, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "dev": true, + "dependencies": { + "pinkie": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pixel-stream": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/pixel-stream/-/pixel-stream-1.0.3.tgz", + "integrity": "sha1-U+jFSyHVUIOTtTvLMrZKd1Xx+l4=", + "dependencies": { + "shallow-copy": "0.0.1" + } + }, + "node_modules/pixelmatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/pixelmatch/-/pixelmatch-4.0.2.tgz", + "integrity": "sha1-j0fc7FARtHe2fbA8JDvB8wheiFQ=", + "dependencies": { + "pngjs": "^3.0.0" + }, + "bin": { + "pixelmatch": "bin/pixelmatch" + } + }, + "node_modules/png-stream": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/png-stream/-/png-stream-1.0.5.tgz", + "integrity": "sha1-W8cWh+qJWUJ+lQ5Sx8yknipvBMY=", + "dependencies": { + "bl": "^0.9.3", + "buffer-crc32": "^0.2.3", + "buffer-equal": "^0.0.1", + "pixel-stream": "^1.0.3" + } + }, + "node_modules/pngjs": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-3.4.0.tgz", + "integrity": "sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w==", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/promise-nodeify": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/promise-nodeify/-/promise-nodeify-3.0.1.tgz", + "integrity": "sha512-ghsSuzZXJX8iO7WVec2z7GI+Xk/EyiD+JZK7AZKhUqYfpLa/Zs4ylUD+CwwnKlG6G3HnkUPMAi6PO7zeqGKssg==", + "engines": { + "node": ">=6", + "npm": ">=1.3.7" + } + }, + "node_modules/proxying-agent": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/proxying-agent/-/proxying-agent-2.4.0.tgz", + "integrity": "sha512-b9vDqIcViJZVsWPpQlp9Py74u+Wqd0a+kMkkg7zX58mwNtrNbOChNlRTM7lUrlpiwNzyJCV8+5D8rnZYLDFh7Q==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/psl": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", + "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==" + }, + "node_modules/punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "engines": { + "node": ">=6" + } + }, + "node_modules/qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.2.tgz", + "integrity": "sha512-dB15eXv3p2jDlbOiNLyMabYg1/sXvppd8DP2J3EOCQ0AkuSXCW2tP7mnVouVLJKgUMY6yP0kcQDVpLCN13h4Xg==", + "dev": true + }, + "node_modules/read-chunk": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-chunk/-/read-chunk-1.0.1.tgz", + "integrity": "sha1-X2jKswfmY/GZk1J9m1icrORmEZQ=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "dev": true, + "dependencies": { + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "dev": true, + "dependencies": { + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/read-pkg/node_modules/path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "node_modules/readdirp": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", + "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/redent": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", + "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", + "dev": true, + "dependencies": { + "indent-string": "^2.1.0", + "strip-indent": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/reflect-metadata": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz", + "integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==" + }, + "node_modules/regenerator-runtime": { + "version": "0.13.7", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", + "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==" + }, + "node_modules/regexpp": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz", + "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/repeating": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", + "dev": true, + "dependencies": { + "is-finite": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/request": { + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "dependencies": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", + "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", + "dev": true, + "dependencies": { + "is-core-module": "^2.2.0", + "path-parse": "^1.0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "node_modules/sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" + }, + "node_modules/semver": { + "version": "7.3.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", + "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/shallow-copy": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/shallow-copy/-/shallow-copy-0.0.1.tgz", + "integrity": "sha1-QV9CcC1z2BAzApLMXuhurhoRoXA=" + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/signal-exit": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==" + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/slice-ansi/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/slice-ansi/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/slice-ansi/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.19", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", + "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", + "dev": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/spdx-correct": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", + "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", + "dev": true, + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "dev": true + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.7.tgz", + "integrity": "sha512-U+MTEOO0AiDzxwFvoa4JVnMV6mZlJKk2sBLt90s7G0Gd0Mlknc7kxEn3nuDPNZRta7O2uy8oLcZLVT+4sqNZHQ==", + "dev": true + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "node_modules/sshpk": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", + "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "dependencies": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + }, + "bin": { + "sshpk-conv": "bin/sshpk-conv", + "sshpk-sign": "bin/sshpk-sign", + "sshpk-verify": "bin/sshpk-verify" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stream-to": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/stream-to/-/stream-to-0.2.2.tgz", + "integrity": "sha1-hDBgmNhf25kLn6MAsbPM9V6O8B0=", + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/stream-to-array": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/stream-to-array/-/stream-to-array-2.3.0.tgz", + "integrity": "sha1-u/azn19D7DC8cbq8s3VXrOzzQ1M=", + "dependencies": { + "any-promise": "^1.1.0" + } + }, + "node_modules/stream-to-buffer": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/stream-to-buffer/-/stream-to-buffer-0.1.0.tgz", + "integrity": "sha1-JnmdkDqyAlyb1VCsRxcbAPjdgKk=", + "dependencies": { + "stream-to": "~0.2.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + }, + "node_modules/string-width": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", + "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dependencies": { + "ansi-regex": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "dev": true, + "dependencies": { + "is-utf8": "^0.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", + "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", + "dev": true, + "dependencies": { + "get-stdin": "^4.0.1" + }, + "bin": { + "strip-indent": "cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/table": { + "version": "6.0.7", + "resolved": "https://registry.npmjs.org/table/-/table-6.0.7.tgz", + "integrity": "sha512-rxZevLGTUzWna/qBLObOe16kB2RTnnbhciwgPbMMlazz1yZGVEgnZK762xyVdVznhqxrfCeBMmMkgOOaPwjH7g==", + "dev": true, + "dependencies": { + "ajv": "^7.0.2", + "lodash": "^4.17.20", + "slice-ansi": "^4.0.0", + "string-width": "^4.2.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/table/node_modules/ajv": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-7.1.0.tgz", + "integrity": "sha512-svS9uILze/cXbH0z2myCK2Brqprx/+JJYK5pHicT/GQiBfzzhUVAIT6MwqJg8y4xV/zoGsUeuPuwtoiKSGE15g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "node_modules/table/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 + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true + }, + "node_modules/timm": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/timm/-/timm-1.7.1.tgz", + "integrity": "sha512-IjZc9KIotudix8bMaBW6QvMuq64BrJWFs1+4V0lXwWGQZwH+LnX87doAYhem4caOEusRP9/g6jVDQmZ8XOk1nw==" + }, + "node_modules/tinify": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/tinify/-/tinify-1.5.0.tgz", + "integrity": "sha1-a6LqfognyEXSY947RvTbe61VWSA=", + "dependencies": { + "promise-nodeify": ">= 0.1", + "proxying-agent": ">= 2.1" + }, + "engines": { + "node": ">= 4.0" + } + }, + "node_modules/tinycolor2": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.4.2.tgz", + "integrity": "sha512-vJhccZPs965sV/L2sU4oRQVAos0pQXwsvTLkWYdqJ+a8Q5kPFzJTuOFwy7UniPli44NKQGAglksjvOcpo95aZA==", + "engines": { + "node": "*" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "dependencies": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/tree-kill": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", + "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", + "dev": true, + "bin": { + "tree-kill": "cli.js" + } + }, + "node_modules/trim-newlines": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", + "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ts-node": { + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-9.1.1.tgz", + "integrity": "sha512-hPlt7ZACERQGf03M253ytLY3dHbGNGrAq9qIHWUY9XHYl1z7wYngSr3OQ5xmui8o2AaxsONxIzjafLUiWBo1Fg==", + "dev": true, + "dependencies": { + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "source-map-support": "^0.5.17", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/ts-node-dev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ts-node-dev/-/ts-node-dev-1.1.1.tgz", + "integrity": "sha512-kAO8LUZgXZSY0+PucMPsQ0Bbdv0x+lgbN7j8gcD4PuTI4uKC6YchekaspmYTBNilkiu+rQYkWJA7cK+Q8/B0tQ==", + "dev": true, + "dependencies": { + "chokidar": "^3.4.0", + "dateformat": "~1.0.4-1.2.3", + "dynamic-dedupe": "^0.3.0", + "minimist": "^1.2.5", + "mkdirp": "^1.0.4", + "resolve": "^1.0.0", + "rimraf": "^2.6.1", + "source-map-support": "^0.5.12", + "tree-kill": "^1.2.2", + "ts-node": "^9.0.0", + "tsconfig": "^7.0.0" + }, + "bin": { + "ts-node-dev": "lib/bin.js", + "tsnd": "lib/bin.js" + }, + "engines": { + "node": ">=0.8.0" + }, + "peerDependencies": { + "node-notifier": "*", + "typescript": "*" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/ts-node-dev/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/ts-node-dev/node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/tsconfig": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/tsconfig/-/tsconfig-7.0.0.tgz", + "integrity": "sha512-vZXmzPrL+EmC4T/4rVlT2jNVMWCi/O4DIiSj3UHg1OE5kCKbk4mfrXc6dZksLgRM/TZlKnousKH9bbTazUWRRw==", + "dev": true, + "dependencies": { + "@types/strip-bom": "^3.0.0", + "@types/strip-json-comments": "0.0.30", + "strip-bom": "^3.0.0", + "strip-json-comments": "^2.0.0" + } + }, + "node_modules/tsconfig/node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/tsconfig/node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/tsutils": { + "version": "3.20.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.20.0.tgz", + "integrity": "sha512-RYbuQuvkhuqVeXweWT3tJLKOEJ/UUw9GjNEZGWdrLLlM+611o1gwLHBpxoFJKKl25fLprp2eVthtKs5JOrNeXg==", + "dev": true, + "dependencies": { + "tslib": "^1.8.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/tsyringe": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/tsyringe/-/tsyringe-4.4.0.tgz", + "integrity": "sha512-SlMApe1lhIq546CDp7bF+IdF4RB6d+9C5T7B0AS0P/Bm+Qpizj/gEmZzvw9J/KlXPEt4qHTbi1TRvX3rCPSdTg==", + "dependencies": { + "tslib": "^1.9.3" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } + }, + "node_modules/tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/typescript": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.1.5.tgz", + "integrity": "sha512-6OSu9PTIzmn9TCDiovULTnET6BgXtDYL4Gg4szY+cGsc3JP1dQL8qvE8kShTRx1NIw4Q9IBHlwODjkjWEtMUyA==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/url-regex": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/url-regex/-/url-regex-3.2.0.tgz", + "integrity": "sha1-260eDJ4p4QXdCx8J9oYvf9tIJyQ=", + "dependencies": { + "ip-regex": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/utif": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/utif/-/utif-2.0.1.tgz", + "integrity": "sha512-Z/S1fNKCicQTf375lIP9G8Sa1H/phcysstNrrSdZKj1f9g58J4NMgb5IgiEZN9/nLMPDwF0W7hdOe9Qq2IYoLg==", + "dependencies": { + "pako": "^1.0.5" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "node_modules/uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "bin": { + "uuid": "bin/uuid" + } + }, + "node_modules/v8-compile-cache": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.2.0.tgz", + "integrity": "sha512-gTpR5XQNKFwOd4clxfnhaqvfqMpqEwr4tOtCyz4MtYZX2JYhfr1JvBFKdS+7K/9rfpZR3VLX+YWBbKoxCgS43Q==", + "dev": true + }, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "engines": [ + "node >=0.6.0" + ], + "dependencies": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "node_modules/wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=", + "dependencies": { + "defaults": "^1.0.3" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "node_modules/xhr": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/xhr/-/xhr-2.6.0.tgz", + "integrity": "sha512-/eCGLb5rxjx5e3mF1A7s+pLlR6CGyqWN91fv1JgER5mVWg1MZmlhBvy9kjcsOdRk8RrIujotWyJamfyrp+WIcA==", + "dependencies": { + "global": "~4.4.0", + "is-function": "^1.0.1", + "parse-headers": "^2.0.0", + "xtend": "^4.0.0" + } + }, + "node_modules/xml-parse-from-string": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/xml-parse-from-string/-/xml-parse-from-string-1.0.1.tgz", + "integrity": "sha1-qQKekp09vN7RafPG4oI42VpdWig=" + }, + "node_modules/xml2js": { + "version": "0.4.23", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", + "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", + "dependencies": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/xmlbuilder": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", + "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "engines": { + "node": ">=0.4" + } + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true, + "engines": { + "node": ">=6" + } + } + }, "dependencies": { + "@babel/code-frame": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", + "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", + "dev": true, + "requires": { + "@babel/highlight": "^7.10.4" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", + "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", + "dev": true + }, + "@babel/highlight": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.12.13.tgz", + "integrity": "sha512-kocDQvIbgMKlWxXe9fof3TQ+gkIPOUSEYhJjqUjvKMez3krV7vbzYCDq39Oj11UAVK7JqPVGQPlgE85dPNlQww==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.12.11", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "dependencies": { + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + } + } + }, "@babel/runtime": { "version": "7.12.13", "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.12.13.tgz", @@ -12,6 +3931,24 @@ "regenerator-runtime": "^0.13.4" } }, + "@eslint/eslintrc": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.3.0.tgz", + "integrity": "sha512-1JTKgrOKAHVivSvOYw+sJOunkBjUOvjqWk1DPja7ZFhIS2mX/4EgTT8M7eTK9jrKhL/FvXXEbQwIs3pg1xp3dg==", + "dev": true, + "requires": { + "ajv": "^6.12.4", + "debug": "^4.1.1", + "espree": "^7.3.0", + "globals": "^12.1.0", + "ignore": "^4.0.6", + "import-fresh": "^3.2.1", + "js-yaml": "^3.13.1", + "lodash": "^4.17.20", + "minimatch": "^3.0.4", + "strip-json-comments": "^3.1.1" + } + }, "@gizeta/swf-reader": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/@gizeta/swf-reader/-/swf-reader-1.0.0.tgz", @@ -346,10 +4283,198 @@ "resolved": "https://registry.npmjs.org/@jvitela/mustache-wax/-/mustache-wax-1.0.3.tgz", "integrity": "sha512-5M5p8d9YQwEDSa0oLoeCZ8ECiM2ZJLKxI/D0pDByiNBJw+4Tizjk/NMIjGx7IoJOGBnWcfHX3Pwd6m/MpMHoGA==" }, + "@nodelib/fs.scandir": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.4.tgz", + "integrity": "sha512-33g3pMJk3bg5nXbL/+CY6I2eJDzZAni49PfJnL5fghPTggPvBd/pFNSgJsdAgWptuFu7qq/ERvOYFlhvsLTCKA==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "2.0.4", + "run-parallel": "^1.1.9" + } + }, + "@nodelib/fs.stat": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.4.tgz", + "integrity": "sha512-IYlHJA0clt2+Vg7bccq+TzRdJvv19c2INqBSsoOLp1je7xjtr7J26+WXR72MCdvU9q1qTzIWDfhMf+DRvQJK4Q==", + "dev": true + }, + "@nodelib/fs.walk": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.6.tgz", + "integrity": "sha512-8Broas6vTtW4GIXTAHDoE32hnN2M5ykgCpWGbuXHQ15vEMqr23pB76e/GZcYsZCHALv50ktd24qhEyKr6wBtow==", + "dev": true, + "requires": { + "@nodelib/fs.scandir": "2.1.4", + "fastq": "^1.6.0" + } + }, + "@types/bytebuffer": { + "version": "5.0.42", + "resolved": "https://registry.npmjs.org/@types/bytebuffer/-/bytebuffer-5.0.42.tgz", + "integrity": "sha512-lEgKojWUAc/MG2t649oZS5AfYFP2xRNPoDuwDBlBMjHXd8MaGPgFgtCXUK7inZdBOygmVf10qxc1Us8GXC96aw==", + "dev": true, + "requires": { + "@types/long": "*", + "@types/node": "*" + } + }, + "@types/json-schema": { + "version": "7.0.7", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.7.tgz", + "integrity": "sha512-cxWFQVseBm6O9Gbw1IWb8r6OS4OhSt3hPZLkFApLjM8TEXROBuQGLAH2i2gZpcXdLBIrpXuTDhH7Vbm1iXmNGA==", + "dev": true + }, + "@types/long": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.1.tgz", + "integrity": "sha512-5tXH6Bx/kNGd3MgffdmP4dy2Z+G4eaXw0SE81Tq3BNadtnMR5/ySMzX4SLEzHJzSmPNn4HIdpQsBvXMUykr58w==", + "dev": true + }, "@types/node": { - "version": "14.14.22", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.22.tgz", - "integrity": "sha512-g+f/qj/cNcqKkc3tFqlXOYjrmZA+jNBiDzbP3kH+B+otKFqAdPgVTGP1IeKRdMml/aE69as5S4FqtxAbl+LaMw==" + "version": "14.14.28", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.28.tgz", + "integrity": "sha512-lg55ArB+ZiHHbBBttLpzD07akz0QPrZgUODNakeC09i62dnrywr9mFErHuaPlB6I7z+sEbK+IYmplahvplCj2g==", + "dev": true + }, + "@types/node-fetch": { + "version": "2.5.8", + "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.5.8.tgz", + "integrity": "sha512-fbjI6ja0N5ZA8TV53RUqzsKNkl9fv8Oj3T7zxW7FGv1GSH7gwJaNF8dzCjrqKaxKeUpTz4yT1DaJFq/omNpGfw==", + "dev": true, + "requires": { + "@types/node": "*", + "form-data": "^3.0.0" + }, + "dependencies": { + "form-data": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", + "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + } + } + } + }, + "@types/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-FKjsOVbC6B7bdSB5CuzyHCkK69I=", + "dev": true + }, + "@types/strip-json-comments": { + "version": "0.0.30", + "resolved": "https://registry.npmjs.org/@types/strip-json-comments/-/strip-json-comments-0.0.30.tgz", + "integrity": "sha512-7NQmHra/JILCd1QqpSzl8+mJRc8ZHz3uDm8YV1Ks9IhK0epEiTw8aIErbvH9PI+6XbqhyIQy3462nEsn7UVzjQ==", + "dev": true + }, + "@types/xml2js": { + "version": "0.4.8", + "resolved": "https://registry.npmjs.org/@types/xml2js/-/xml2js-0.4.8.tgz", + "integrity": "sha512-EyvT83ezOdec7BhDaEcsklWy7RSIdi6CNe95tmOAK0yx/Lm30C9K75snT3fYayK59ApC2oyW+rcHErdG05FHJA==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@typescript-eslint/eslint-plugin": { + "version": "4.15.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.15.1.tgz", + "integrity": "sha512-yW2epMYZSpNJXZy22Biu+fLdTG8Mn6b22kR3TqblVk50HGNV8Zya15WAXuQCr8tKw4Qf1BL4QtI6kv6PCkLoJw==", + "dev": true, + "requires": { + "@typescript-eslint/experimental-utils": "4.15.1", + "@typescript-eslint/scope-manager": "4.15.1", + "debug": "^4.1.1", + "functional-red-black-tree": "^1.0.1", + "lodash": "^4.17.15", + "regexpp": "^3.0.0", + "semver": "^7.3.2", + "tsutils": "^3.17.1" + } + }, + "@typescript-eslint/experimental-utils": { + "version": "4.15.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.15.1.tgz", + "integrity": "sha512-9LQRmOzBRI1iOdJorr4jEnQhadxK4c9R2aEAsm7WE/7dq8wkKD1suaV0S/JucTL8QlYUPU1y2yjqg+aGC0IQBQ==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.3", + "@typescript-eslint/scope-manager": "4.15.1", + "@typescript-eslint/types": "4.15.1", + "@typescript-eslint/typescript-estree": "4.15.1", + "eslint-scope": "^5.0.0", + "eslint-utils": "^2.0.0" + } + }, + "@typescript-eslint/parser": { + "version": "4.15.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.15.1.tgz", + "integrity": "sha512-V8eXYxNJ9QmXi5ETDguB7O9diAXlIyS+e3xzLoP/oVE4WCAjssxLIa0mqCLsCGXulYJUfT+GV70Jv1vHsdKwtA==", + "dev": true, + "requires": { + "@typescript-eslint/scope-manager": "4.15.1", + "@typescript-eslint/types": "4.15.1", + "@typescript-eslint/typescript-estree": "4.15.1", + "debug": "^4.1.1" + } + }, + "@typescript-eslint/scope-manager": { + "version": "4.15.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.15.1.tgz", + "integrity": "sha512-ibQrTFcAm7yG4C1iwpIYK7vDnFg+fKaZVfvyOm3sNsGAerKfwPVFtYft5EbjzByDJ4dj1WD8/34REJfw/9wdVA==", + "dev": true, + "requires": { + "@typescript-eslint/types": "4.15.1", + "@typescript-eslint/visitor-keys": "4.15.1" + } + }, + "@typescript-eslint/types": { + "version": "4.15.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.15.1.tgz", + "integrity": "sha512-iGsaUyWFyLz0mHfXhX4zO6P7O3sExQpBJ2dgXB0G5g/8PRVfBBsmQIc3r83ranEQTALLR3Vko/fnCIVqmH+mPw==", + "dev": true + }, + "@typescript-eslint/typescript-estree": { + "version": "4.15.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.15.1.tgz", + "integrity": "sha512-z8MN3CicTEumrWAEB2e2CcoZa3KP9+SMYLIA2aM49XW3cWIaiVSOAGq30ffR5XHxRirqE90fgLw3e6WmNx5uNw==", + "dev": true, + "requires": { + "@typescript-eslint/types": "4.15.1", + "@typescript-eslint/visitor-keys": "4.15.1", + "debug": "^4.1.1", + "globby": "^11.0.1", + "is-glob": "^4.0.1", + "semver": "^7.3.2", + "tsutils": "^3.17.1" + } + }, + "@typescript-eslint/visitor-keys": { + "version": "4.15.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.15.1.tgz", + "integrity": "sha512-tYzaTP9plooRJY8eNlpAewTOqtWW/4ff/5wBjNVaJ0S0wC4Gpq/zDVRTJa5bq2v1pCNQ08xxMCndcvR+h7lMww==", + "dev": true, + "requires": { + "@typescript-eslint/types": "4.15.1", + "eslint-visitor-keys": "^2.0.0" + } + }, + "acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true + }, + "acorn-jsx": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz", + "integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==", + "dev": true }, "ajv": { "version": "6.12.6", @@ -367,6 +4492,26 @@ "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-0.1.1.tgz", "integrity": "sha1-tcdcUyBS3M1qOcAGTHcsjVegbNI=" }, + "ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "dev": true + }, + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, "any-base": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/any-base/-/any-base-1.1.0.tgz", @@ -377,6 +4522,43 @@ "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8=" }, + "anymatch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", + "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", + "dev": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "array-find-index": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", + "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", + "dev": true + }, + "array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true + }, "asn1": { "version": "0.2.4", "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", @@ -390,6 +4572,12 @@ "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" }, + "astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "dev": true + }, "asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", @@ -405,6 +4593,12 @@ "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==" }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, "base64-js": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", @@ -423,6 +4617,12 @@ "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-2.4.0.tgz", "integrity": "sha1-g4qZLan51zfg9LLbC+YrsJ3Qxeg=" }, + "binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true + }, "bl": { "version": "0.9.5", "resolved": "https://registry.npmjs.org/bl/-/bl-0.9.5.tgz", @@ -436,6 +4636,25 @@ "resolved": "https://registry.npmjs.org/bmp-js/-/bmp-js-0.1.0.tgz", "integrity": "sha1-4Fpj95amwf8l9Hcex62twUjAcjM=" }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, "buffer": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", @@ -455,6 +4674,12 @@ "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-0.0.1.tgz", "integrity": "sha1-kbx0sR6kBbyRa8aqkI+q+ltKrEs=" }, + "buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", + "dev": true + }, "bytebuffer": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/bytebuffer/-/bytebuffer-5.0.1.tgz", @@ -463,11 +4688,127 @@ "long": "~3" } }, + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true + }, + "camelcase": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", + "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", + "dev": true + }, + "camelcase-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", + "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", + "dev": true, + "requires": { + "camelcase": "^2.0.0", + "map-obj": "^1.0.0" + } + }, "caseless": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "chokidar": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz", + "integrity": "sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==", + "dev": true, + "requires": { + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "fsevents": "~2.3.1", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.5.0" + } + }, + "cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "requires": { + "restore-cursor": "^3.1.0" + } + }, + "cli-spinners": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.5.0.tgz", + "integrity": "sha512-PC+AmIuK04E6aeSs/pUccSujsTzBhu4HzC2dL+CfJB/Jcc2qTRbEwZQDfIUpt2Xl8BodYBEq8w4fc0kU2I9DjQ==" + }, + "clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=" + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, "combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", @@ -489,11 +4830,43 @@ "pixel-stream": "^1.0.3" } }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, "core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" }, + "create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true + }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "currently-unhandled": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", + "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", + "dev": true, + "requires": { + "array-find-index": "^1.0.1" + } + }, "dashdash": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", @@ -502,16 +4875,88 @@ "assert-plus": "^1.0.0" } }, + "dateformat": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-1.0.12.tgz", + "integrity": "sha1-nxJLZ1lMk3/3BpMuSmQsyo27/uk=", + "dev": true, + "requires": { + "get-stdin": "^4.0.1", + "meow": "^3.3.0" + } + }, + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true + }, + "deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "dev": true + }, + "defaults": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", + "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", + "requires": { + "clone": "^1.0.2" + } + }, "delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" }, + "diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true + }, + "dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "requires": { + "path-type": "^4.0.0" + } + }, + "doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, "dom-walk": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.2.tgz", "integrity": "sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==" }, + "dynamic-dedupe": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/dynamic-dedupe/-/dynamic-dedupe-0.3.0.tgz", + "integrity": "sha1-BuRMIj9eTpTXjvnbI6ZRXOL5YqE=", + "dev": true, + "requires": { + "xtend": "^4.0.0" + } + }, "ecc-jsbn": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", @@ -521,11 +4966,190 @@ "safer-buffer": "^2.1.0" } }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "enquirer": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", + "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", + "dev": true, + "requires": { + "ansi-colors": "^4.1.1" + } + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "requires": { + "is-arrayish": "^0.2.1" + } + }, "es6-promise": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.3.1.tgz", "integrity": "sha1-oIzd6EzNvzTQJ6FFG8kdS80ophM=" }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "eslint": { + "version": "7.20.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.20.0.tgz", + "integrity": "sha512-qGi0CTcOGP2OtCQBgWZlQjcTuP0XkIpYFj25XtRTQSHC+umNnp7UMshr2G8SLsRFYDdAPFeHOsiteadmMH02Yw==", + "dev": true, + "requires": { + "@babel/code-frame": "7.12.11", + "@eslint/eslintrc": "^0.3.0", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "enquirer": "^2.3.5", + "eslint-scope": "^5.1.1", + "eslint-utils": "^2.1.0", + "eslint-visitor-keys": "^2.0.0", + "espree": "^7.3.1", + "esquery": "^1.4.0", + "esutils": "^2.0.2", + "file-entry-cache": "^6.0.0", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^5.0.0", + "globals": "^12.1.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "js-yaml": "^3.13.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash": "^4.17.20", + "minimatch": "^3.0.4", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "progress": "^2.0.0", + "regexpp": "^3.1.0", + "semver": "^7.2.1", + "strip-ansi": "^6.0.0", + "strip-json-comments": "^3.1.0", + "table": "^6.0.4", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + } + }, + "eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + } + }, + "eslint-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^1.1.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true + } + } + }, + "eslint-visitor-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz", + "integrity": "sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ==", + "dev": true + }, + "espree": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", + "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", + "dev": true, + "requires": { + "acorn": "^7.4.0", + "acorn-jsx": "^5.3.1", + "eslint-visitor-keys": "^1.3.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true + } + } + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true + }, + "esquery": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", + "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "dev": true, + "requires": { + "estraverse": "^5.1.0" + }, + "dependencies": { + "estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true + } + } + }, + "esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "requires": { + "estraverse": "^5.2.0" + }, + "dependencies": { + "estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true + } + } + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true + }, "exif-parser": { "version": "0.1.12", "resolved": "https://registry.npmjs.org/exif-parser/-/exif-parser-0.1.12.tgz", @@ -551,16 +5175,89 @@ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" }, + "fast-glob": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.5.tgz", + "integrity": "sha512-2DtFcgT68wiTTiwZ2hNdJfcHNke9XOfnwmBRWXhmeKM8rF0TGwmC/Qto3S7RoZKp5cilZbxzO5iTNTQsJ+EeDg==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.0", + "merge2": "^1.3.0", + "micromatch": "^4.0.2", + "picomatch": "^2.2.1" + } + }, "fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, + "fastq": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.10.1.tgz", + "integrity": "sha512-AWuv6Ery3pM+dY7LYS8YIaCiQvUaos9OB1RyNgaOWnaX+Tik7Onvcsf8x8c+YtDeT0maYLniBip2hox5KtEXXA==", + "dev": true, + "requires": { + "reusify": "^1.0.4" + } + }, + "file-entry-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.0.tgz", + "integrity": "sha512-fqoO76jZ3ZnYrXLDRxBR1YvOvc0k844kcOg40bgsPrE25LAb/PDqTY+ho64Xh2c8ZXgIKldchCFHczG2UVRcWA==", + "dev": true, + "requires": { + "flat-cache": "^3.0.4" + } + }, "file-type": { "version": "9.0.0", "resolved": "https://registry.npmjs.org/file-type/-/file-type-9.0.0.tgz", "integrity": "sha512-Qe/5NJrgIOlwijpq3B7BEpzPFcgzggOTagZmkXQY4LA6bsXKTUstK7Wp12lEJ/mLKTpvIZxmIuRcLYWT6ov9lw==" }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true, + "requires": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "dev": true, + "requires": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + } + }, + "flatted": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.1.1.tgz", + "integrity": "sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA==", + "dev": true + }, "forever-agent": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", @@ -641,6 +5338,37 @@ } } }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "optional": true + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "dev": true + }, + "get-stdin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", + "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", + "dev": true + }, "getpass": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", @@ -658,6 +5386,29 @@ "omggif": "^1.0.10" } }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-parent": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", + "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, "global": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/global/-/global-4.4.0.tgz", @@ -667,6 +5418,43 @@ "process": "^0.11.10" } }, + "globals": { + "version": "12.4.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", + "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", + "dev": true, + "requires": { + "type-fest": "^0.8.1" + } + }, + "globby": { + "version": "11.0.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.2.tgz", + "integrity": "sha512-2ZThXDvvV8fYFRVIxnrMQBipZQDr7MxKAmQK1vujaj9/7eF0efG7BPUKJ7jP7G5SLF37xKDXvO4S/KKLj/Z0og==", + "dev": true, + "requires": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.1.1", + "ignore": "^5.1.4", + "merge2": "^1.3.0", + "slash": "^3.0.0" + }, + "dependencies": { + "ignore": { + "version": "5.1.8", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", + "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", + "dev": true + } + } + }, + "graceful-fs": { + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", + "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==", + "dev": true + }, "har-schema": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", @@ -681,6 +5469,27 @@ "har-schema": "^2.0.0" } }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "hosted-git-info": { + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", + "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==", + "dev": true + }, "http-signature": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", @@ -696,11 +5505,52 @@ "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" }, + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true + }, "image-q": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/image-q/-/image-q-1.1.1.tgz", "integrity": "sha1-/IQJlmRGC5DKhi2TALa/u7+/gFY=" }, + "import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "indent-string": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", + "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", + "dev": true, + "requires": { + "repeating": "^2.0.0" + } + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, "inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", @@ -711,21 +5561,95 @@ "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-1.0.3.tgz", "integrity": "sha1-3FiQdvZZ9BnCIgOaMzFvHHOH7/0=" }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-core-module": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.2.0.tgz", + "integrity": "sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-finite": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz", + "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, "is-function": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-function/-/is-function-1.0.2.tgz", "integrity": "sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ==" }, + "is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-interactive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", + "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==" + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, "is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" }, + "is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", + "dev": true + }, "isarray": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, "isstream": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", @@ -757,6 +5681,22 @@ "pixel-stream": "^1.0.3" } }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, "jsbn": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", @@ -772,6 +5712,12 @@ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true + }, "json-stringify-safe": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", @@ -788,6 +5734,16 @@ "verror": "1.10.0" } }, + "levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + } + }, "load-bmfont": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/load-bmfont/-/load-bmfont-1.4.1.tgz", @@ -803,16 +5759,56 @@ "xtend": "^4.0.0" } }, + "load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" + } + }, "lodash": { "version": "4.17.20", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==" }, + "log-symbols": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.0.0.tgz", + "integrity": "sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA==", + "requires": { + "chalk": "^4.0.0" + } + }, "long": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/long/-/long-3.2.0.tgz", "integrity": "sha1-2CG3E4yhy1gcFymQ7xTbIAtcR0s=" }, + "loud-rejection": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", + "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", + "dev": true, + "requires": { + "currently-unhandled": "^0.4.1", + "signal-exit": "^3.0.0" + } + }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, "lzma-purejs": { "version": "0.9.3", "resolved": "https://registry.npmjs.org/lzma-purejs/-/lzma-purejs-0.9.3.tgz", @@ -822,11 +5818,57 @@ "commander": "~2.0.0" } }, + "make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, + "map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", + "dev": true + }, "maxrects-packer": { "version": "2.7.2", "resolved": "https://registry.npmjs.org/maxrects-packer/-/maxrects-packer-2.7.2.tgz", "integrity": "sha512-akd5IRLPqQeWlpJyRJyfYq86VB05zzbMIdyTgLxRk4z1H0A8g4oTJW31Yo6zO9piSRsFNYdzmgudW7J2g1gEhQ==" }, + "meow": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", + "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", + "dev": true, + "requires": { + "camelcase-keys": "^2.0.0", + "decamelize": "^1.1.2", + "loud-rejection": "^1.0.0", + "map-obj": "^1.0.1", + "minimist": "^1.1.3", + "normalize-package-data": "^2.3.4", + "object-assign": "^4.0.1", + "read-pkg-up": "^1.0.1", + "redent": "^1.0.0", + "trim-newlines": "^1.0.0" + } + }, + "merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true + }, + "micromatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", + "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "dev": true, + "requires": { + "braces": "^3.0.1", + "picomatch": "^2.0.5" + } + }, "mime": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", @@ -845,6 +5887,11 @@ "mime-db": "1.45.0" } }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" + }, "min-document": { "version": "2.19.0", "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz", @@ -853,6 +5900,15 @@ "dom-walk": "^0.1.0" } }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, "minimist": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", @@ -866,11 +5922,23 @@ "minimist": "^1.2.5" } }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, "mustache": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/mustache/-/mustache-2.3.2.tgz", "integrity": "sha512-KpMNwdQsYz3O/SBS1qJ/o3sqUJ5wSb8gb0pul8CO0S56b9Y2ALm8zCfsjPXsqGFfoNBkDwZuZIAjhsZI03gYVQ==" }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true + }, "node-fetch": { "version": "2.6.1", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", @@ -881,21 +5949,138 @@ "resolved": "https://registry.npmjs.org/node-gzip/-/node-gzip-1.1.2.tgz", "integrity": "sha512-ZB6zWpfZHGtxZnPMrJSKHVPrRjURoUzaDbLFj3VO70mpLTW5np96vXyHwft4Id0o+PYIzgDkBUjIzaNHhQ8srw==" }, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + }, "oauth-sign": { "version": "0.9.0", "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true + }, "omggif": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/omggif/-/omggif-1.0.10.tgz", "integrity": "sha512-LMJTtvgc/nugXj0Vcrrs68Mn2D1r0zf630VNtqtpI1FEO7e+O9FP4gqs9AcnBaSEeoHIPm28u6qgPR0oyEpGSw==" }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "optionator": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "dev": true, + "requires": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" + } + }, + "ora": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.3.0.tgz", + "integrity": "sha512-zAKMgGXUim0Jyd6CXK9lraBnD3H5yPGBPPOkC23a2BG6hsm4Zu6OQSjQuEtV0BHDf4aKHcUFvJiGRrFuW3MG8g==", + "requires": { + "bl": "^4.0.3", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "log-symbols": "^4.0.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + }, + "dependencies": { + "bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "requires": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "requires": { + "safe-buffer": "~5.2.0" + } + } + } + }, "pako": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" }, + "parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "requires": { + "callsites": "^3.0.0" + } + }, "parse-bmfont-ascii": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/parse-bmfont-ascii/-/parse-bmfont-ascii-1.0.6.tgz", @@ -920,6 +6105,48 @@ "resolved": "https://registry.npmjs.org/parse-headers/-/parse-headers-2.0.3.tgz", "integrity": "sha512-QhhZ+DCCit2Coi2vmAKbq5RGTRcQUOE2+REgv8vdyu7MnYx2eZztegqtTx99TZ86GTIwqiy3+4nQTWZ2tgmdCA==" }, + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "dev": true, + "requires": { + "error-ex": "^1.2.0" + } + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "dev": true, + "requires": { + "pinkie-promise": "^2.0.0" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, + "path-parse": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", + "dev": true + }, + "path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true + }, "performance-now": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", @@ -930,6 +6157,33 @@ "resolved": "https://registry.npmjs.org/phin/-/phin-2.9.3.tgz", "integrity": "sha512-CzFr90qM24ju5f88quFC/6qohjC144rehe5n6DH900lgXmUe86+xCKc10ev56gRKC4/BkHUoG4uSiQgBiIXwDA==" }, + "picomatch": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", + "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", + "dev": true + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "dev": true + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "dev": true, + "requires": { + "pinkie": "^2.0.0" + } + }, "pixel-stream": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/pixel-stream/-/pixel-stream-1.0.3.tgz", @@ -962,11 +6216,23 @@ "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-3.4.0.tgz", "integrity": "sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w==" }, + "prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true + }, "process": { "version": "0.11.10", "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=" }, + "progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true + }, "promise-nodeify": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/promise-nodeify/-/promise-nodeify-3.0.1.tgz", @@ -992,11 +6258,51 @@ "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" }, + "queue-microtask": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.2.tgz", + "integrity": "sha512-dB15eXv3p2jDlbOiNLyMabYg1/sXvppd8DP2J3EOCQ0AkuSXCW2tP7mnVouVLJKgUMY6yP0kcQDVpLCN13h4Xg==", + "dev": true + }, "read-chunk": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/read-chunk/-/read-chunk-1.0.1.tgz", "integrity": "sha1-X2jKswfmY/GZk1J9m1icrORmEZQ=" }, + "read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "dev": true, + "requires": { + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" + }, + "dependencies": { + "path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + } + } + }, + "read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "dev": true, + "requires": { + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" + } + }, "readable-stream": { "version": "1.0.34", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", @@ -1008,6 +6314,25 @@ "string_decoder": "~0.10.x" } }, + "readdirp": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", + "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", + "dev": true, + "requires": { + "picomatch": "^2.2.1" + } + }, + "redent": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", + "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", + "dev": true, + "requires": { + "indent-string": "^2.1.0", + "strip-indent": "^1.0.1" + } + }, "reflect-metadata": { "version": "0.1.13", "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz", @@ -1018,6 +6343,21 @@ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==" }, + "regexpp": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz", + "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==", + "dev": true + }, + "repeating": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", + "dev": true, + "requires": { + "is-finite": "^1.0.0" + } + }, "request": { "version": "2.88.2", "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", @@ -1045,6 +6385,61 @@ "uuid": "^3.3.2" } }, + "require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true + }, + "resolve": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", + "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", + "dev": true, + "requires": { + "is-core-module": "^2.2.0", + "path-parse": "^1.0.6" + } + }, + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true + }, + "restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "requires": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + } + }, + "reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "requires": { + "queue-microtask": "^1.2.2" + } + }, "safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", @@ -1060,11 +6455,137 @@ "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" }, + "semver": { + "version": "7.3.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", + "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, "shallow-copy": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/shallow-copy/-/shallow-copy-0.0.1.tgz", "integrity": "sha1-QV9CcC1z2BAzApLMXuhurhoRoXA=" }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true + }, + "signal-exit": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==" + }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true + }, + "slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + } + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "source-map-support": { + "version": "0.5.19", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", + "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "spdx-correct": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", + "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", + "dev": true, + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "dev": true + }, + "spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.7.tgz", + "integrity": "sha512-U+MTEOO0AiDzxwFvoa4JVnMV6mZlJKk2sBLt90s7G0Gd0Mlknc7kxEn3nuDPNZRta7O2uy8oLcZLVT+4sqNZHQ==", + "dev": true + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, "sshpk": { "version": "1.16.1", "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", @@ -1107,6 +6628,96 @@ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" }, + "string-width": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", + "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + } + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "requires": { + "ansi-regex": "^5.0.0" + } + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "dev": true, + "requires": { + "is-utf8": "^0.2.0" + } + }, + "strip-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", + "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", + "dev": true, + "requires": { + "get-stdin": "^4.0.1" + } + }, + "strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "table": { + "version": "6.0.7", + "resolved": "https://registry.npmjs.org/table/-/table-6.0.7.tgz", + "integrity": "sha512-rxZevLGTUzWna/qBLObOe16kB2RTnnbhciwgPbMMlazz1yZGVEgnZK762xyVdVznhqxrfCeBMmMkgOOaPwjH7g==", + "dev": true, + "requires": { + "ajv": "^7.0.2", + "lodash": "^4.17.20", + "slice-ansi": "^4.0.0", + "string-width": "^4.2.0" + }, + "dependencies": { + "ajv": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-7.1.0.tgz", + "integrity": "sha512-svS9uILze/cXbH0z2myCK2Brqprx/+JJYK5pHicT/GQiBfzzhUVAIT6MwqJg8y4xV/zoGsUeuPuwtoiKSGE15g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "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 + } + } + }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true + }, "timm": { "version": "1.7.1", "resolved": "https://registry.npmjs.org/timm/-/timm-1.7.1.tgz", @@ -1126,6 +6737,15 @@ "resolved": "https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.4.2.tgz", "integrity": "sha512-vJhccZPs965sV/L2sU4oRQVAos0pQXwsvTLkWYdqJ+a8Q5kPFzJTuOFwy7UniPli44NKQGAglksjvOcpo95aZA==" }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + }, "tough-cookie": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", @@ -1135,11 +6755,108 @@ "punycode": "^2.1.1" } }, + "tree-kill": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", + "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", + "dev": true + }, + "trim-newlines": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", + "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", + "dev": true + }, + "ts-node": { + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-9.1.1.tgz", + "integrity": "sha512-hPlt7ZACERQGf03M253ytLY3dHbGNGrAq9qIHWUY9XHYl1z7wYngSr3OQ5xmui8o2AaxsONxIzjafLUiWBo1Fg==", + "dev": true, + "requires": { + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "source-map-support": "^0.5.17", + "yn": "3.1.1" + } + }, + "ts-node-dev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ts-node-dev/-/ts-node-dev-1.1.1.tgz", + "integrity": "sha512-kAO8LUZgXZSY0+PucMPsQ0Bbdv0x+lgbN7j8gcD4PuTI4uKC6YchekaspmYTBNilkiu+rQYkWJA7cK+Q8/B0tQ==", + "dev": true, + "requires": { + "chokidar": "^3.4.0", + "dateformat": "~1.0.4-1.2.3", + "dynamic-dedupe": "^0.3.0", + "minimist": "^1.2.5", + "mkdirp": "^1.0.4", + "resolve": "^1.0.0", + "rimraf": "^2.6.1", + "source-map-support": "^0.5.12", + "tree-kill": "^1.2.2", + "ts-node": "^9.0.0", + "tsconfig": "^7.0.0" + }, + "dependencies": { + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + } + } + }, + "tsconfig": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/tsconfig/-/tsconfig-7.0.0.tgz", + "integrity": "sha512-vZXmzPrL+EmC4T/4rVlT2jNVMWCi/O4DIiSj3UHg1OE5kCKbk4mfrXc6dZksLgRM/TZlKnousKH9bbTazUWRRw==", + "dev": true, + "requires": { + "@types/strip-bom": "^3.0.0", + "@types/strip-json-comments": "0.0.30", + "strip-bom": "^3.0.0", + "strip-json-comments": "^2.0.0" + }, + "dependencies": { + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + }, + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "dev": true + } + } + }, "tslib": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" }, + "tsutils": { + "version": "3.20.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.20.0.tgz", + "integrity": "sha512-RYbuQuvkhuqVeXweWT3tJLKOEJ/UUw9GjNEZGWdrLLlM+611o1gwLHBpxoFJKKl25fLprp2eVthtKs5JOrNeXg==", + "dev": true, + "requires": { + "tslib": "^1.8.1" + } + }, "tsyringe": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/tsyringe/-/tsyringe-4.4.0.tgz", @@ -1161,6 +6878,27 @@ "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" }, + "type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1" + } + }, + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true + }, + "typescript": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.1.5.tgz", + "integrity": "sha512-6OSu9PTIzmn9TCDiovULTnET6BgXtDYL4Gg4szY+cGsc3JP1dQL8qvE8kShTRx1NIw4Q9IBHlwODjkjWEtMUyA==", + "dev": true + }, "uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", @@ -1185,11 +6923,32 @@ "pako": "^1.0.5" } }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, "uuid": { "version": "3.4.0", "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" }, + "v8-compile-cache": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.2.0.tgz", + "integrity": "sha512-gTpR5XQNKFwOd4clxfnhaqvfqMpqEwr4tOtCyz4MtYZX2JYhfr1JvBFKdS+7K/9rfpZR3VLX+YWBbKoxCgS43Q==", + "dev": true + }, + "validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, "verror": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", @@ -1200,6 +6959,35 @@ "extsprintf": "^1.2.0" } }, + "wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=", + "requires": { + "defaults": "^1.0.3" + } + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, "xhr": { "version": "2.6.0", "resolved": "https://registry.npmjs.org/xhr/-/xhr-2.6.0.tgz", @@ -1234,6 +7022,18 @@ "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true } } } diff --git a/package.json b/package.json index ac9b35e..3211635 100644 --- a/package.json +++ b/package.json @@ -4,13 +4,12 @@ "description": "", "main": "index.js", "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" + "start:dev": "ts-node-dev --respawn --transpile-only src/Main.ts" }, "author": "", "license": "ISC", "dependencies": { "@gizeta/swf-reader": "^1.0.0", - "@types/node": "^14.14.22", "bytebuffer": "^5.0.1", "concat-frames": "^1.0.3", "free-tex-packer-core": "^0.3.2", @@ -19,11 +18,23 @@ "lodash": "^4.17.20", "node-fetch": "^2.6.1", "node-gzip": "^1.1.2", + "ora": "^5.3.0", "png-stream": "^1.0.5", "reflect-metadata": "^0.1.13", "stream-to-array": "^2.3.0", "tsyringe": "^4.4.0", "xml2js": "^0.4.23" }, - "devDependencies": {} + "devDependencies": { + "@types/bytebuffer": "^5.0.42", + "@types/node": "^14.14.28", + "@types/node-fetch": "^2.5.8", + "@types/xml2js": "^0.4.8", + "@typescript-eslint/eslint-plugin": "^4.15.1", + "@typescript-eslint/parser": "^4.15.1", + "eslint": "^7.20.0", + "ts-node": "^9.1.1", + "ts-node-dev": "^1.1.1", + "typescript": "^4.1.5" + } } diff --git a/src/Main.ts b/src/Main.ts index d883500..e9dd10c 100644 --- a/src/Main.ts +++ b/src/Main.ts @@ -1,34 +1,47 @@ -import "reflect-metadata"; -import Configuration from "./config/Configuration"; -import {container} from "tsyringe"; -import FigureConverter from "./figure/FigureConverter"; -import FurnitureConverter from "./furniture/FurnitureConverter"; -import PetConverter from "./pet/PetConverter"; -import EffectConverter from "./effect/EffectConverter"; +import 'reflect-metadata'; +import { container } from 'tsyringe'; +import { BundleProvider } from './common/bundle/BundleProvider'; +import { Configuration } from './common/config/Configuration'; +import { FurnitureConverter } from './converters/furniture/FurnitureConverter'; +import { PetConverter } from './converters/pet/PetConverter'; +import { Mapper } from './mapping/mappers/asset/Mapper'; -(async () => { +(async () => +{ const config = container.resolve(Configuration); await config.init(); - if (config.getBoolean("convert.figure")) { - const figureConverter = container.resolve(FigureConverter); - await figureConverter.convertAsync(); - } + const prohibitedSizes = (config.getValue('prohibited.sizes') || '').split(','); + const prohibitedSizesAsset = []; - if (config.getBoolean("convert.furniture")) { + for(const prohibitedSize of prohibitedSizes) prohibitedSizesAsset.push('_' + prohibitedSize + '_'); + + Mapper.PROHIBITED_SIZES = prohibitedSizes; + BundleProvider.PROHIBITED_SIZES = prohibitedSizesAsset; + + // if(config.getBoolean('convert.figure')) + // { + // const figureConverter = container.resolve(FigureConverter); + // await figureConverter.convertAsync(); + // } + + if(config.getBoolean('convert.furniture')) + { const furnitureConverter = container.resolve(FurnitureConverter); await furnitureConverter.convertAsync(); } - if (config.getBoolean("convert.pet")) { + if(config.getBoolean('convert.pet')) + { const petConverter = container.resolve(PetConverter); await petConverter.convertAsync(); } - if (config.getBoolean("convert.effect")) { - const effectConverter = container.resolve(EffectConverter); - await effectConverter.convertAsync(); - } + // if(config.getBoolean('convert.effect')) + // { + // const effectConverter = container.resolve(EffectConverter); + // await effectConverter.convertAsync(); + // } console.log('finished!'); -})() \ No newline at end of file +})(); diff --git a/src/bundle/BundleProvider.ts b/src/bundle/BundleProvider.ts deleted file mode 100644 index 57ff49c..0000000 --- a/src/bundle/BundleProvider.ts +++ /dev/null @@ -1,113 +0,0 @@ -import HabboAssetSWF from "../swf/HabboAssetSWF"; -import BundleTypes from "./BundleTypes"; -import SymbolClassTag from "../swf/tags/SymbolClassTag"; -import ImageTag from "../swf/tags/ImageTag"; -import {singleton} from "tsyringe"; - -const {packAsync} = require('free-tex-packer-core'); - -@singleton() -export default class BundleProvider { - public static imageSource: Map = new Map(); - - public async generateSpriteSheet(habboAssetSWF: HabboAssetSWF, outputFolder: string, type: string): Promise { - const tagList: Array = habboAssetSWF.symbolTags(); - const names: Array = new Array(); - const tags: Array = new Array(); - for (const tag of tagList) { - names.push(...tag.names); - tags.push(...tag.tags); - } - - const images: Array<{ path: string, contents: Buffer }> = new Array<{ path: string, contents: Buffer }>(); - - const imageTags: Array = habboAssetSWF.imageTags(); - for (const imageTag of imageTags) { - if (tags.includes(imageTag.characterID)) { - for (let i = 0; i < tags.length; i++) { - if (tags[i] == imageTag.characterID) { - if ( - (names[i].includes("_64_") && type === "furniture") || - (names[i].includes("_icon_") && type === "furniture") || - (names[i].includes("_h_") && (type === "figure" || type === "effect")) || - (names[i].includes("_64_") && type === "pet")) { - - if (names[i] !== imageTag.className) { - BundleProvider.imageSource.set(names[i].substring(habboAssetSWF.getDocumentClass().length + 1), imageTag.className.substring(habboAssetSWF.getDocumentClass().length + 1)); - if ((imageTag.className.includes("_32_") && type === "furniture") || - (imageTag.className.includes("_sh_") && (type === "figure" || type === "effect")) || - (imageTag.className.includes("_32_") && type === "pet")) { - images.push({ - path: imageTag.className, - contents: imageTag.imgData - }); - } - } - } - } - } - } - - if ((imageTag.className.includes("_64_") && type === "furniture") || - (imageTag.className.includes("_1_") && type === "furniture") || - (imageTag.className.includes("_icon_") && type === "furniture") || - (imageTag.className.includes("_h_") && (type === "figure" || type === "effect")) || - (imageTag.className.includes("_64_") && type === "pet")) { - images.push({ - path: imageTag.className, - contents: imageTag.imgData - }); - } - } - - - if (images.length === 0) { - return null; - } - - return await this.packImages(habboAssetSWF.getDocumentClass(), outputFolder + "/", images); - } - - async packImages(documentClass: string, outputFolder: string, images: Array<{ path: string, contents: Buffer }>): Promise { - let options = { - textureName: documentClass, - width: 3072, - height: 2048, - fixedSize: false, - allowRotation: true, - detectIdentical: true, - allowTrim: true, - exporter: "Pixi" - }; - - const archiveType: BundleTypes = {} as any; - const imageData: { - name: string, - buffer: Buffer - } = {} as any; - - try { - const files = await packAsync(images, options); - for (let item of files) { - if (item.name.endsWith(".json")) { - archiveType.spriteSheetType = JSON.parse(item.buffer.toString('utf8')); - } else { - imageData.buffer = item.buffer; - imageData.name = item.name; - } - } - - if (archiveType.spriteSheetType === null) throw new Error("Failed to parse SpriteSheet. " + images[0].path); - } catch (error) { - console.log("Image Packing Error: "); - console.log(error); - } - - if (archiveType.spriteSheetType !== null) { - archiveType.spriteSheetType.meta.image = imageData.name; - archiveType.imageData = imageData; - } - - return archiveType; - } -} \ No newline at end of file diff --git a/src/bundle/BundleTypes.ts b/src/bundle/BundleTypes.ts deleted file mode 100644 index 375bd4c..0000000 --- a/src/bundle/BundleTypes.ts +++ /dev/null @@ -1,63 +0,0 @@ -export default interface BundleTypes { - spriteSheetType: SpriteSheetType, - imageData: { - name: string, - buffer: Buffer - } -} - -export interface SpriteSheetType { - frames: SpriteSheetFrames, - meta: SpriteSheetMeta -} - -export interface SpriteSheetFrames { - [key: string]: SpriteSheetFrame -} - -export interface SpriteSheetFrame { - frame: SpriteSheetFrameDimensions, - rotated: boolean, - trimmed: boolean, - spriteSourceSize: SpriteSourceSize - sourceSize: SourceSize, - pivot: FramePivot -} - -export interface FramePivot { - x: number, - y: number -} - -export interface SourceSize { - w: number, - h: number -} - -export interface SpriteSourceSize { - x: number, - y: number, - w: number, - h: number -} - -export interface SpriteSheetFrameDimensions { - x: number, - y: number, - w: number, - h: number -} - -export interface SpriteSheetMeta { - app: string, - version: string, - image: string, - format: string, - size: SpriteSheetSize, - scale: number -} - -export interface SpriteSheetSize { - w: number, - h: number -} \ No newline at end of file diff --git a/src/common/bundle/BundleProvider.ts b/src/common/bundle/BundleProvider.ts new file mode 100644 index 0000000..3eeb18c --- /dev/null +++ b/src/common/bundle/BundleProvider.ts @@ -0,0 +1,144 @@ +import { packAsync } from 'free-tex-packer-core'; +import { singleton } from 'tsyringe'; +import { HabboAssetSWF } from '../../swf/HabboAssetSWF'; +import { Configuration } from '../config/Configuration'; +import { SpriteBundle } from './SpriteBundle'; + +@singleton() +export class BundleProvider +{ + public static PROHIBITED_SIZES: string[] = []; + + public static imageSource: Map = new Map(); + + constructor(private readonly _configuration: Configuration) + {} + + public async generateSpriteSheet(habboAssetSWF: HabboAssetSWF): Promise + { + const tagList = habboAssetSWF.symbolTags(); + const names: string[] = []; + const tags: number[] = []; + + for(const tag of tagList) + { + names.push(...tag.names); + tags.push(...tag.tags); + } + + const images: { path: string, contents: Buffer }[] = []; + + const imageTags = habboAssetSWF.imageTags(); + + for(const imageTag of imageTags) + { + if(tags.includes(imageTag.characterID)) + { + for(let i = 0; i < tags.length; i++) + { + if(tags[i] != imageTag.characterID) continue; + + if(names[i] == imageTag.className) continue; + + let isProhibited = false; + + for(const size of BundleProvider.PROHIBITED_SIZES) + { + if(imageTag.className.indexOf(size) >= 0) + { + isProhibited = true; + + break; + } + } + + if(isProhibited) continue; + + BundleProvider.imageSource.set(names[i].substring(habboAssetSWF.getDocumentClass().length + 1), imageTag.className.substring(habboAssetSWF.getDocumentClass().length + 1)); + + images.push({ + path: imageTag.className, + contents: imageTag.imgData + }); + } + } + + let isProhibited = false; + + for(const size of BundleProvider.PROHIBITED_SIZES) + { + if(imageTag.className.indexOf(size) >= 0) + { + isProhibited = true; + + break; + } + } + + if(isProhibited) continue; + + images.push({ + path: imageTag.className, + contents: imageTag.imgData + }); + } + + if(!images.length) return null; + + return await this.packImages(habboAssetSWF.getDocumentClass(), images); + } + + async packImages(documentClass: string, images: { path: string, contents: Buffer }[]): Promise + { + try + { + const files = await packAsync(images, { + textureName: documentClass, + width: 3072, + height: 2048, + fixedSize: false, + allowRotation: true, + detectIdentical: true, + allowTrim: true, + //@ts-ignore + exporter: 'Pixi' + }); + + const bundle = new SpriteBundle(); + + for(const item of files) + { + if(item.name.endsWith('.json')) + { + bundle.spritesheet = JSON.parse(item.buffer.toString('utf8')); + + delete bundle.spritesheet.meta.app; + delete bundle.spritesheet.meta.version; + } + else + { + bundle.imageData = { + name: item.name, + buffer: item.buffer + }; + } + } + + if(!bundle.spritesheet) throw new Error('Failed to parse SpriteSheet. ' + images[0].path); + + if((bundle.spritesheet !== undefined) && (bundle.imageData !== undefined)) + { + bundle.spritesheet.meta.image = bundle.imageData.name; + } + + return bundle; + } + + catch (error) + { + console.error('Image Packing Error', error); + } + + return null; + } +} diff --git a/src/common/bundle/SpriteBundle.ts b/src/common/bundle/SpriteBundle.ts new file mode 100644 index 0000000..f9be598 --- /dev/null +++ b/src/common/bundle/SpriteBundle.ts @@ -0,0 +1,27 @@ +import { ISpritesheetData } from '../../mapping/json'; + +export class SpriteBundle +{ + private _spritesheet: ISpritesheetData; + private _imageData: { name: string, buffer: Buffer}; + + public get spritesheet(): ISpritesheetData + { + return this._spritesheet; + } + + public set spritesheet(spritesheet: ISpritesheetData) + { + this._spritesheet = spritesheet; + } + + public get imageData(): { name: string, buffer: Buffer} + { + return this._imageData; + } + + public set imageData(imageData: { name: string, buffer: Buffer }) + { + this._imageData = imageData; + } +} diff --git a/src/common/config/Configuration.ts b/src/common/config/Configuration.ts new file mode 100644 index 0000000..0e184db --- /dev/null +++ b/src/common/config/Configuration.ts @@ -0,0 +1,61 @@ +import { singleton } from 'tsyringe'; +import * as configuration from '../../configuration.json'; +import { FileUtilities } from '../../utils/FileUtilities'; + +@singleton() +export class Configuration +{ + private readonly _config: Map; + + constructor() + { + this._config = new Map(); + } + + public async init(): Promise + { + for(const key of Object.keys(configuration)) this._config.set(key, configuration[key]); + } + + public async loadExternalVariables(): Promise + { + const url = this.getValue('external_vars.url'); + + try + { + const content = await FileUtilities.readFileAsString(url); + const config: string[] = content.split('\n'); + + for(const configEntry of config) + { + const configEntrySplit = configEntry.split('='); + const configKey = configEntrySplit[0]; + const configValue = configEntrySplit[1]; + + this._config.set(configKey, configValue); + } + } + + catch (error) + { + console.log(); + console.error(error); + } + } + + public getBoolean(key: string): boolean + { + return this._config.get(key) === '1'; + } + + public getValue(key: string, value: string = ''): string + { + if(this._config.has(key)) + { + // @ts-ignore + return this._config.get(key); + } + + return value; + } +} diff --git a/src/common/converters/SWFConverter.ts b/src/common/converters/SWFConverter.ts new file mode 100644 index 0000000..ef41a91 --- /dev/null +++ b/src/common/converters/SWFConverter.ts @@ -0,0 +1,102 @@ +import { wrap } from 'bytebuffer'; +import { parseStringPromise } from 'xml2js'; +import { HabboAssetSWF } from '../../swf/HabboAssetSWF'; +import { DefineBinaryDataTag } from '../../swf/tags/DefineBinaryDataTag'; + +export class SWFConverter +{ + private static getBinaryData(habboAssetSWF: HabboAssetSWF, type: string, documentNameTwice: boolean): DefineBinaryDataTag + { + let binaryName = habboAssetSWF.getFullClassName(type, documentNameTwice); + let tag = habboAssetSWF.getBinaryTagByName(binaryName); + + if(!tag) + { + binaryName = habboAssetSWF.getFullClassNameSnake(type, documentNameTwice, true); + tag = habboAssetSWF.getBinaryTagByName(binaryName); + } + + return tag; + } + + protected static getPalette(habboAssetSWF: HabboAssetSWF, paletteName: string): [ number, number, number ][] + { + const binaryData = SWFConverter.getBinaryData(habboAssetSWF, paletteName, false); + + if(!binaryData || !binaryData.binaryDataBuffer) return null; + + const byteBuffer = wrap(binaryData.binaryDataBuffer); + + const paletteColors: [ number, number, number ][] = []; + + try + { + let R = 0; + let G = 0; + let B = 0; + let counter = 1; + + while((binaryData.binaryDataBuffer.length - byteBuffer.offset) > 0) + { + if(counter == 1) R = byteBuffer.readUint8(); + + else if(counter == 2) G = byteBuffer.readUint8(); + + else if(counter == 3) + { + B = byteBuffer.readUint8(); + paletteColors.push([ R, G, B ]); + + counter = 0; + } + + counter++; + } + + return paletteColors; + } + + catch (err) + { + console.log(err); + } + + return null; + } + + protected static async getAssetsXML(habboAssetSWF: HabboAssetSWF): Promise + { + const binaryData = SWFConverter.getBinaryData(habboAssetSWF, 'assets', true); + + if(!binaryData) return null; + + return await parseStringPromise(binaryData.binaryData); + } + + protected static async getLogicXML(habboAssetSWF: HabboAssetSWF): Promise + { + const binaryData = SWFConverter.getBinaryData(habboAssetSWF, 'logic', true); + + if(!binaryData) return null; + + return await parseStringPromise(binaryData.binaryData); + } + + protected static async getIndexXML(habboAssetSWF: HabboAssetSWF): Promise + { + const binaryData = SWFConverter.getBinaryData(habboAssetSWF, 'index', false); + + if(!binaryData) return null; + + return await parseStringPromise(binaryData.binaryData); + } + + protected static async getVisualizationXML(habboAssetSWF: HabboAssetSWF): Promise + { + const binaryData = SWFConverter.getBinaryData(habboAssetSWF, 'visualization', true); + + if(!binaryData) return null; + + return await parseStringPromise(binaryData.binaryData); + } +} diff --git a/src/config.json b/src/config.json deleted file mode 100644 index 99cfe11..0000000 --- a/src/config.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "output.folder.furniture": "/home/user/WebstormProjects/sites/assets.nitro.se/game/dcr/furniture-test/", - "output.folder.figure": "/home/user/WebstormProjects/sites/assets.nitro.se/game/gordon/figure-test/", - "output.folder.effect": "/home/user/WebstormProjects/sites/assets.nitro.se/game/gordon/effect-test/", - "output.folder.pet": "/home/user/WebstormProjects/sites/assets.nitro.se/game/gordon/pet-test/", - "furnidata.url": "http://assets.nitro.se/game/harmony/furnidata.xml", - "figuremap.url": "http://assets.nitro.se/game/gordon/figuremap.xml", - "effectmap.url": "http://assets.nitro.se/game/gordon/PRODUCTION-201701242205-837386173/effectmap.xml", - "external_vars.url": "http://assets.nitro.se/game/gamedata/external_variables.txt", - "dynamic.download.url.furniture": "/home/user/WebstormProjects/sites/assets.nitro.se/game/harmony/hof_furni/%className%.swf", - "dynamic.download.url.figure": "/home/user/WebstormProjects/sites/assets.nitro.se/game/gordon/PRODUCTION-201701242205-837386173/%className%.swf", - "dynamic.download.url.effect": "/home/user/WebstormProjects/sites/assets.nitro.se/game/gordon/PRODUCTION-201701242205-837386173/%className%.swf", - "dynamic.download.url.pet": "/home/user/WebstormProjects/sites/assets.nitro.se/game/gordon/PRODUCTION-201701242205-837386173/%className%.swf", - "convert.furniture": "1", - "convert.figure": "0", - "convert.effect": "0", - "convert.pet": "0", - "figure.rotation.enabled": "0", - "figure.skip.non-existing.asset.images": "0" -} \ No newline at end of file diff --git a/src/config/Configuration.ts b/src/config/Configuration.ts deleted file mode 100644 index 70bc293..0000000 --- a/src/config/Configuration.ts +++ /dev/null @@ -1,50 +0,0 @@ -import {singleton} from "tsyringe"; - -const fs = require('fs/promises'); -const fetch = require('node-fetch'); - -const config = require('../config.json'); - -@singleton() -export default class Configuration { - - private readonly _config: Map; - - constructor() { - this._config = new Map(); - } - - async init() { - for (const key of Object.keys(config)) { - this._config.set(key, config[key]); - } - } - - public getBoolean(key: string): boolean { - return this._config.get(key) === "1"; - } - - public getValue(key: string, value: string = ""): string { - if (this._config.has(key)) { - // @ts-ignore - return this._config.get(key); - } - - return value; - } - - public async loadExternalVariables(): Promise { - const url = this.getValue("external_vars.url"); - const fetchData = await fetch(url); - const textData = await fetchData.text(); - - const config: string[] = textData.split("\n"); - for (const configEntry of config) { - const configEntrySplit = configEntry.split("="); - const configKey = configEntrySplit[0]; - const configValue = configEntrySplit[1]; - - this._config.set(configKey, configValue); - } - } -} \ No newline at end of file diff --git a/src/configuration.json.example b/src/configuration.json.example new file mode 100644 index 0000000..b306408 --- /dev/null +++ b/src/configuration.json.example @@ -0,0 +1,19 @@ +{ + "output.folder.furniture": "/converted-assets/furniture/", + "output.folder.figure": "/converted-assets/figure/", + "output.folder.effect": "/converted-assets/effect/", + "output.folder.pet": "/converted-assets/pet/", + "furnidata.url": "/gamedata/json/furnidata", + "figuremap.url": "/gamedata/figuremap.xml", + "effectmap.url": "/gamedata/effectmap.xml", + "external_vars.url": "/gamedata/external_variables.txt", + "dynamic.download.url.furniture": "/dcr/hof_furni/%className%.swf", + "dynamic.download.url.figure": "/gordon/PRODUCTION/%className%.swf", + "dynamic.download.url.effect": "/gordon/PRODUCTION/%className%.swf", + "dynamic.download.url.pet": "/gordon/PRODUCTION/%className%.swf", + "convert.furniture": "1", + "convert.figure": "0", + "convert.effect": "0", + "convert.pet": "1", + "prohibited.sizes": "32,sh" +} diff --git a/src/converters/furniture/FurnitureConverter.ts b/src/converters/furniture/FurnitureConverter.ts new file mode 100644 index 0000000..e0b6751 --- /dev/null +++ b/src/converters/furniture/FurnitureConverter.ts @@ -0,0 +1,130 @@ +import { writeFile } from 'fs/promises'; +import * as ora from 'ora'; +import { singleton } from 'tsyringe'; +import { BundleProvider } from '../../common/bundle/BundleProvider'; +import { SpriteBundle } from '../../common/bundle/SpriteBundle'; +import { Configuration } from '../../common/config/Configuration'; +import { SWFConverter } from '../../common/converters/SWFConverter'; +import { IAssetData } from '../../mapping/json'; +import { AssetMapper, IndexMapper, LogicMapper, VisualizationMapper } from '../../mapping/mappers'; +import { HabboAssetSWF } from '../../swf/HabboAssetSWF'; +import File from '../../utils/File'; +import Logger from '../../utils/Logger'; +import NitroBundle from '../../utils/NitroBundle'; +import { FurnitureDownloader } from './FurnitureDownloader'; + +@singleton() +export class FurnitureConverter extends SWFConverter +{ + constructor( + private readonly _furniDownloader: FurnitureDownloader, + private readonly _configuration: Configuration, + private readonly _bundleProvider: BundleProvider, + private readonly _logger: Logger) + { + super(); + } + + public async convertAsync(): Promise + { + const now = Date.now(); + + const spinner = ora('Preparing Furniture').start(); + + const outputFolder = new File(this._configuration.getValue('output.folder.furniture')); + + if(!outputFolder.isDirectory()) + { + spinner.text = `Creating Folder: ${ outputFolder.path }`; + + spinner.render(); + + outputFolder.mkdirs(); + } + + await this._furniDownloader.download(async (habboAssetSwf: HabboAssetSWF) => + { + spinner.text = 'Parsing Furniture: ' + habboAssetSwf.getDocumentClass(); + + spinner.render(); + + try + { + const spriteBundle = await this._bundleProvider.generateSpriteSheet(habboAssetSwf); + + await this.fromHabboAsset(habboAssetSwf, outputFolder.path, 'furniture', spriteBundle); + } + + catch (error) + { + console.log(); + console.error(error); + } + }); + + spinner.succeed(`Furniture Finished in ${ Date.now() - now }ms`); + } + + private async fromHabboAsset(habboAssetSWF: HabboAssetSWF, outputFolder: string, type: string, spriteBundle: SpriteBundle): Promise + { + const assetData = await this.mapXML2JSON(habboAssetSWF, 'furniture'); + + if(!assetData) return; + + const name = habboAssetSWF.getDocumentClass(); + const path = outputFolder + '/' + name + '.nitro'; + const nitroBundle = new NitroBundle(); + + nitroBundle.addFile((name + '.json'), Buffer.from(JSON.stringify(assetData))); + + if(spriteBundle && (spriteBundle.spritesheet !== undefined)) + { + if(spriteBundle.spritesheet && spriteBundle.imageData) + { + assetData.spritesheet = spriteBundle.spritesheet; + + nitroBundle.addFile(spriteBundle.imageData.name, spriteBundle.imageData.buffer); + } + } + + const buffer = await nitroBundle.toBufferAsync(); + + await writeFile(path, buffer); + } + + private async mapXML2JSON(habboAssetSWF: HabboAssetSWF, assetType: string): Promise + { + if(!habboAssetSWF) return null; + + const assetData: IAssetData = {}; + + assetData.type = assetType; + + try + { + const indexXML = await FurnitureConverter.getIndexXML(habboAssetSWF); + + if(indexXML) IndexMapper.mapXML(indexXML, assetData); + + const assetXML = await FurnitureConverter.getAssetsXML(habboAssetSWF); + + if(assetXML) AssetMapper.mapXML(assetXML, assetData); + + const logicXML = await FurnitureConverter.getLogicXML(habboAssetSWF); + + if(logicXML) LogicMapper.mapXML(logicXML, assetData); + + const visualizationXML = await FurnitureConverter.getVisualizationXML(habboAssetSWF); + + if(visualizationXML) VisualizationMapper.mapXML(visualizationXML, assetData); + + return assetData; + } + + catch (error) + { + console.log(); + console.error(error); + } + } +} diff --git a/src/converters/furniture/FurnitureDownloader.ts b/src/converters/furniture/FurnitureDownloader.ts new file mode 100644 index 0000000..3196900 --- /dev/null +++ b/src/converters/furniture/FurnitureDownloader.ts @@ -0,0 +1,146 @@ +import { singleton } from 'tsyringe'; +import { Configuration } from '../../common/config/Configuration'; +import { IFurnitureData } from '../../mapping/json'; +import { HabboAssetSWF } from '../../swf/HabboAssetSWF'; +import File from '../../utils/File'; +import { FileUtilities } from '../../utils/FileUtilities'; +import Logger from '../../utils/Logger'; + +@singleton() +export class FurnitureDownloader +{ + constructor( + private readonly _configuration: Configuration, + private readonly _logger: Logger) + {} + + public async download(callback: (habboAssetSwf: HabboAssetSWF, className: string) => Promise): Promise + { + try + { + let count = 0; + + const furniData = await this.parseFurniData(); + const classNames: string[] = []; + + const outputFolder = new File(this._configuration.getValue('output.folder.furniture')); + + if(!outputFolder.isDirectory()) outputFolder.mkdirs(); + + if(furniData.roomitemtypes !== undefined) + { + if(furniData.roomitemtypes.furnitype !== undefined) + { + for(const furniType of furniData.roomitemtypes.furnitype) + { + const className = furniType.classname.split('*')[0]; + const revision = furniType.revision; + + if(count === 3) return; + + if(classNames.indexOf(className) >= 0) continue; + + classNames.push(className); + + try + { + await this.extractFurniture(revision, className, callback); + + count ++; + } + + catch(error) + { + console.log(); + console.error(error); + } + } + } + } + + if(furniData.wallitemtypes !== undefined) + { + if(furniData.wallitemtypes.furnitype !== undefined) + { + for(const furniType of furniData.wallitemtypes.furnitype) + { + const className = furniType.classname.split('*')[0]; + const revision = furniType.revision; + + if(classNames.indexOf(className) >= 0) continue; + + classNames.push(className); + + try + { + await this.extractFurniture(revision, className, callback); + } + + catch(error) + { + console.log(); + console.error(error); + } + } + } + } + } + + catch (error) + { + console.log(); + console.error(error); + } + } + + public async parseFurniData(): Promise + { + const url = this._configuration.getValue('furnidata.url'); + + if(!url || !url.length) return null; + + try + { + const content = await FileUtilities.readFileAsString(url); + + if(!content || !content.length) return null; + + return (JSON.parse(content) as IFurnitureData); + } + + catch(error) + { + console.log(); + console.error(error); + } + } + + public async extractFurniture(revision: number, className: string, callback: (habboAssetSwf: HabboAssetSWF, className: string) => Promise): Promise + { + let url = this._configuration.getValue('dynamic.download.url.furniture'); + + if(!url || !url.length) return; + + url = url.replace('%revision%', revision.toString()); + url = url.replace('%className%', className); + + try + { + const buffer = await FileUtilities.readFileAsBuffer(url); + + if(!buffer) return; + + const newHabboAssetSWF = new HabboAssetSWF(buffer); + + await newHabboAssetSWF.setupAsync(); + + await callback(newHabboAssetSWF, className); + } + + catch (error) + { + console.log(); + console.error(error); + } + } +} diff --git a/src/converters/pet/PetConverter.ts b/src/converters/pet/PetConverter.ts new file mode 100644 index 0000000..e1e4499 --- /dev/null +++ b/src/converters/pet/PetConverter.ts @@ -0,0 +1,145 @@ +import { writeFile } from 'fs/promises'; +import { singleton } from 'tsyringe'; +import { BundleProvider } from '../../common/bundle/BundleProvider'; +import { SpriteBundle } from '../../common/bundle/SpriteBundle'; +import { Configuration } from '../../common/config/Configuration'; +import { SWFConverter } from '../../common/converters/SWFConverter'; +import { IAssetData } from '../../mapping/json'; +import { AssetMapper, IndexMapper, LogicMapper, VisualizationMapper } from '../../mapping/mappers'; +import { HabboAssetSWF } from '../../swf/HabboAssetSWF'; +import File from '../../utils/File'; +import Logger from '../../utils/Logger'; +import NitroBundle from '../../utils/NitroBundle'; +import { PetDownloader } from './PetDownloader'; + +@singleton() +export class PetConverter extends SWFConverter +{ + constructor( + private readonly _petDownloader: PetDownloader, + private readonly _config: Configuration, + private readonly _bundleProvider: BundleProvider, + private readonly _logger: Logger) + { + super(); + } + + public async convertAsync(): Promise + { + const outputFolder = new File(this._config.getValue('output.folder.pet')); + + if(!outputFolder.isDirectory()) outputFolder.mkdirs(); + + await this._petDownloader.download(async (habboAssetSwf: HabboAssetSWF) => + { + console.log('Parsing Pet: ' + habboAssetSwf.getDocumentClass()); + + try + { + const spriteBundle = await this._bundleProvider.generateSpriteSheet(habboAssetSwf); + + await this.fromHabboAsset(habboAssetSwf, outputFolder.path, 'pet', spriteBundle); + } + + catch (error) + { + console.log(); + console.error(error); + } + }); + } + + private async fromHabboAsset(habboAssetSWF: HabboAssetSWF, outputFolder: string, type: string, spriteBundle: SpriteBundle): Promise + { + try + { + const assetData = await this.mapXML2JSON(habboAssetSWF, 'pet'); + + if(!assetData) return; + + if(spriteBundle && (spriteBundle.spritesheet !== undefined)) assetData.spritesheet = spriteBundle.spritesheet; + + const name = habboAssetSWF.getDocumentClass(); + const path = outputFolder + '/' + name + '.nitro'; + const nitroBundle = new NitroBundle(); + + nitroBundle.addFile((name + '.json'), Buffer.from(JSON.stringify(assetData))); + + if(spriteBundle.imageData !== undefined) + { + nitroBundle.addFile(spriteBundle.imageData.name, spriteBundle.imageData.buffer); + } + + const buffer = await nitroBundle.toBufferAsync(); + + await writeFile(path, buffer); + } + + catch(err) + { + this._logger.logErrorAsync(err); + } + } + + private async mapXML2JSON(habboAssetSWF: HabboAssetSWF, assetType: string): Promise + { + if(!habboAssetSWF) return null; + + const assetData: IAssetData = {}; + + assetData.type = assetType; + + try + { + const indexXML = await PetConverter.getIndexXML(habboAssetSWF); + + if(indexXML) IndexMapper.mapXML(indexXML, assetData); + + const assetXML = await PetConverter.getAssetsXML(habboAssetSWF); + + if(assetXML) + { + AssetMapper.mapXML(assetXML, assetData); + + if(assetData.palettes !== undefined) + { + for(const paletteId in assetData.palettes) + { + const palette = assetData.palettes[paletteId]; + + const paletteColors = PetConverter.getPalette(habboAssetSWF, palette.source); + + if(!paletteColors) + { + delete assetData.palettes[paletteId]; + + continue; + } + + const rgbs: [ number, number, number ][] = []; + + for(const rgb of paletteColors) rgbs.push([ rgb[0], rgb[1], rgb[2] ]); + + palette.rgb = rgbs; + } + } + } + + const logicXML = await PetConverter.getLogicXML(habboAssetSWF); + + if(logicXML) LogicMapper.mapXML(logicXML, assetData); + + const visualizationXML = await PetConverter.getVisualizationXML(habboAssetSWF); + + if(visualizationXML) VisualizationMapper.mapXML(visualizationXML, assetData); + + return assetData; + } + + catch (error) + { + console.log(); + console.error(error); + } + } +} diff --git a/src/converters/pet/PetDownloader.ts b/src/converters/pet/PetDownloader.ts new file mode 100644 index 0000000..1dfc274 --- /dev/null +++ b/src/converters/pet/PetDownloader.ts @@ -0,0 +1,98 @@ +import { singleton } from 'tsyringe'; +import { Configuration } from '../../common/config/Configuration'; +import { HabboAssetSWF } from '../../swf/HabboAssetSWF'; +import { FileUtilities } from '../../utils/FileUtilities'; +import Logger from '../../utils/Logger'; + +@singleton() +export class PetDownloader +{ + constructor( + private readonly _config: Configuration, + private readonly _logger: Logger) + {} + + public async download(callback: (habboAssetSwf: HabboAssetSWF, className: string) => Promise): Promise + { + try + { + const petTypes = await this.parsePetTypes(); + const classNames: string[] = []; + + for(const petType of petTypes) + { + if(classNames.indexOf(petType) >= 0) continue; + + classNames.push(petType); + + try + { + await this.extractPet(petType, callback); + } + + catch(error) + { + console.log(); + console.error(error); + } + } + } + + catch (error) + { + console.log(); + console.error(error); + } + } + + public async parsePetTypes(): Promise + { + try + { + await this._config.loadExternalVariables(); + + const petTypes: string[] = []; + + const pets = this._config.getValue('pet.configuration'); + + if(pets) + { + const types = pets.split(','); + + for(const type of types) petTypes.push(type); + } + + return petTypes; + } + + catch (error) + { + console.log(); + console.error(error); + } + } + + public async extractPet(className: string, callback: (habboAssetSwf: HabboAssetSWF, className: string) => Promise): Promise + { + let url = this._config.getValue('dynamic.download.url.pet'); + + if(!url || !url.length) return; + + url = url.replace('%className%', className); + + try + { + const buffer = await FileUtilities.readFileAsBuffer(url); + const newHabboAssetSWF = new HabboAssetSWF(buffer); + + await newHabboAssetSWF.setupAsync(); + await callback(newHabboAssetSWF, className); + } + + catch (error) + { + console.log(); + console.error(error); + } + } +} diff --git a/src/effect/EffectConverter.ts b/src/effect/EffectConverter.ts deleted file mode 100644 index fdc1608..0000000 --- a/src/effect/EffectConverter.ts +++ /dev/null @@ -1,107 +0,0 @@ -import HabboAssetSWF from "../swf/HabboAssetSWF"; -import DefineBinaryDataTag from "../swf/tags/DefineBinaryDataTag"; -import {EffectJson} from "./mapper/EffectTypes"; -import BundleTypes from "../bundle/BundleTypes"; -import File from "../utils/File"; -import NitroBundle from "../utils/NitroBundle"; -import EffectDownloader from "./EffectDownloader"; -import EffectJsonMapper from "./mapper/EffectJsonMapper"; -import Configuration from "../config/Configuration"; -import BundleProvider from "../bundle/BundleProvider"; -import {singleton} from "tsyringe"; - -const xml2js = require('xml2js'); -const parser = new xml2js.Parser(/* options */); - -const fs = require('fs').promises; - -@singleton() -export default class EffectConverter { - constructor( - private readonly _effectDownloader: EffectDownloader, - private readonly _effectJsonMapper: EffectJsonMapper, - private readonly _config: Configuration, - private readonly _bundleProvider: BundleProvider) { - } - - private static getBinaryData(habboAssetSWF: HabboAssetSWF, type: string, documentNameTwice: boolean) { - let binaryName: string = habboAssetSWF.getFullClassName(type, documentNameTwice); - let tag = habboAssetSWF.getBinaryTagByName(binaryName); - if (tag === null) { - binaryName = habboAssetSWF.getFullClassNameSnake(type, documentNameTwice, true); - tag = habboAssetSWF.getBinaryTagByName(binaryName); - } - - return tag; - } - - private static async getManifestXML(habboAssetSWF: HabboAssetSWF): Promise { - const binaryData: DefineBinaryDataTag | null = this.getBinaryData(habboAssetSWF, "manifest", false); - if (binaryData !== null) { - return await parser.parseStringPromise(binaryData.binaryData); - } - - return null; - } - - private static async getAnimationXML(habboAssetSWF: HabboAssetSWF): Promise { - const binaryData: DefineBinaryDataTag | null = this.getBinaryData(habboAssetSWF, "animation", false); - if (binaryData !== null) { - return await parser.parseStringPromise(binaryData.binaryData); - } - - return null; - } - - private async convertXML2JSON(habboAssetSWF: HabboAssetSWF): Promise { - const manifestXML = await EffectConverter.getManifestXML(habboAssetSWF); - const animationXML = await EffectConverter.getAnimationXML(habboAssetSWF); - - return this._effectJsonMapper.mapXML(habboAssetSWF, manifestXML, animationXML); - } - - private async fromHabboAsset(habboAssetSWF: HabboAssetSWF, outputFolder: string, type: string, archiveType: BundleTypes) { - const effectJson = await this.convertXML2JSON(habboAssetSWF); - if (effectJson !== null) { - effectJson.spritesheet = archiveType.spriteSheetType; - effectJson.type = type; - - const path = outputFolder + "/" + habboAssetSWF.getDocumentClass() + ".nitro"; - const assetOutputFolder = new File(path); - if (assetOutputFolder.exists()) { - console.log("Effect already exists or the directory is not empty!"); - - return; - } - - const nitroBundle = new NitroBundle(); - nitroBundle.addFile(habboAssetSWF.getDocumentClass() + ".json", Buffer.from(JSON.stringify(effectJson))); - nitroBundle.addFile(archiveType.imageData.name, archiveType.imageData.buffer); - - const buffer = await nitroBundle.toBufferAsync(); - await fs.writeFile(path, buffer); - } - } - - public async convertAsync() { - const outputFolderEffect = new File(this._config.getValue("output.folder.effect")); - if (!outputFolderEffect.isDirectory()) { - outputFolderEffect.mkdirs(); - } - - const effectConverter = this; - await this._effectDownloader.download(async function (habboAssetSwf: HabboAssetSWF) { - console.log("Attempt parsing effect: " + habboAssetSwf.getDocumentClass()); - - try { - const spriteSheetType = await effectConverter._bundleProvider.generateSpriteSheet(habboAssetSwf, outputFolderEffect.path, "effect"); - if (spriteSheetType !== null) { - await effectConverter.fromHabboAsset(habboAssetSwf, outputFolderEffect.path, "effect", spriteSheetType); - } - } catch (e) { - console.log(e); - console.log("Effect error: " + habboAssetSwf.getDocumentClass()); - } - }); - } -} \ No newline at end of file diff --git a/src/effect/EffectDownloader.ts b/src/effect/EffectDownloader.ts deleted file mode 100644 index 9129701..0000000 --- a/src/effect/EffectDownloader.ts +++ /dev/null @@ -1,76 +0,0 @@ -import Configuration from "../config/Configuration"; -import HabboAssetSWF from "../swf/HabboAssetSWF"; -import File from "../utils/File"; -import {singleton} from "tsyringe"; -import Logger from "../utils/Logger"; - -const fetch = require('node-fetch'); -const xml2js = require('xml2js'); -const parser = new xml2js.Parser(/* options */); - -@singleton() -export default class EffectDownloader { - - constructor( - private readonly _config: Configuration, - private readonly _logger: Logger) { - } - - public static types: Map = new Map(); - - public async download(callback: (habboAssetSwf: HabboAssetSWF) => Promise) { - const outputFolderEffect = this._config.getValue("output.folder.effect"); - const figureMap = await this.parseEffectMap(); - const map = figureMap.map; - - for (const lib of map.effect) { - const info = lib['$']; - const className: string = info.lib; - - const assetOutputFolder = new File(outputFolderEffect + "/" + className); - if (assetOutputFolder.exists()) { - continue; - } - - if (!EffectDownloader.types.has(className)) { - const url = this._config.getValue("dynamic.download.url.effect").replace("%className%", className); - let buffer: Buffer | null = null; - - if (url.includes("http")) { - const fetchData = await fetch(url); - if (fetchData.status === 404) { - console.log("SWF File does not exist: " + url); - continue; - } - - const arrayBuffer = await fetchData.arrayBuffer(); - buffer = Buffer.from(arrayBuffer); - } else { - const file = new File(url); - if (!file.exists()) { - console.log("SWF File does not exist: " + file.path); - continue; - } - } - - try { - const newHabboAssetSWF: HabboAssetSWF = new HabboAssetSWF(buffer !== null ? buffer : url); - await newHabboAssetSWF.setupAsync(); - - EffectDownloader.types.set(className, info.type); - await callback(newHabboAssetSWF); - } catch (e) { - await this._logger.logErrorAsync(`[${className}]` + e); - } - } - } - } - - async parseEffectMap() { - const figureMapPath = this._config.getValue("effectmap.url"); - const figureFetch = await fetch(figureMapPath); - const figureMap = await figureFetch.text(); - - return await parser.parseStringPromise(figureMap); - } -} \ No newline at end of file diff --git a/src/effect/mapper/EffectAnimationXMLTypes.ts b/src/effect/mapper/EffectAnimationXMLTypes.ts deleted file mode 100644 index 8dcabc4..0000000 --- a/src/effect/mapper/EffectAnimationXMLTypes.ts +++ /dev/null @@ -1,522 +0,0 @@ -export class AnimationXML { - private readonly _name: string; - private readonly _desc: string; - private readonly _resetOnToggle: boolean | undefined; - - private readonly _directions: Array; - private readonly _shadows: Array; - private readonly _adds: Array; - private readonly _removes: Array; - private readonly _sprites: Array; - private readonly _frames: Array; - private readonly _avatars: Array; - private readonly _overrides: Array; - - constructor(animationXML: any) { - const animation = animationXML.animation; - const attributes = animation.$; - - this._name = attributes.name; - this._desc = attributes.desc; - - if (attributes.resetOnToggle !== undefined) this._resetOnToggle = attributes.resetOnToggle === '1'; - - this._directions = new Array(); - if (animation.direction !== undefined) { - for (const direction of animation.direction) { - this._directions.push(new DirectionOffsetXML(direction)); - } - } - - this._shadows = new Array(); - if (animation.shadow !== undefined) { - for (const shadow of animation.shadow) { - this._shadows.push(new ShadowXML(shadow)); - } - } - - this._adds = new Array(); - if (animation.add !== undefined) { - for (const add of animation.add) { - this._adds.push(new AddXML(add)); - } - } - - this._removes = new Array(); - if (animation.remove !== undefined) { - for (const remove of animation.remove) { - this._removes.push(new RemoveXML(remove)); - } - } - - this._sprites = new Array(); - if (animation.sprite !== undefined) { - for (const sprite of animation.sprite) { - this._sprites.push(new SpriteXML(sprite)); - } - } - - this._frames = new Array(); - if (animation.frame !== undefined) { - for (const frame of animation.frame) { - this._frames.push(new FrameXML(frame)); - } - } - - this._avatars = new Array(); - if (animation.avatar !== undefined) { - for (const avatar of animation.avatar) { - this._avatars.push(new AvatarXML(avatar)); - } - } - - this._overrides = new Array(); - if (animation.override !== undefined) { - for (const override of animation.override) { - this._overrides.push(new OverrideXML(override)); - } - } - } - - get name(): string { - return this._name; - } - - get desc(): string { - return this._desc; - } - - get resetOnToggle(): boolean | undefined { - return this._resetOnToggle; - } - - get directions(): Array { - return this._directions; - } - - get shadows(): Array { - return this._shadows; - } - - get adds(): Array { - return this._adds; - } - - get removes(): Array { - return this._removes; - } - - get sprites(): Array { - return this._sprites; - } - - get frames(): Array { - return this._frames; - } - - get avatars(): Array { - return this._avatars; - } - - get overrides(): Array { - return this._overrides; - } -} - -export class OverrideXML { - private readonly _name: string; - private readonly _override: string; - - private readonly _frames: Array; - - constructor(overrideXML: any) { - const attributes = overrideXML.$; - - this._name = attributes.name; - this._override = attributes.override; - - this._frames = new Array(); - if (overrideXML.frame !== undefined) { - for (const frame of overrideXML.frame) { - this._frames.push(new FrameXML(frame)); - } - } - } - - get name(): string { - return this._name; - } - - get override(): string { - return this._override; - } - - get frames(): Array { - return this._frames; - } -} - -export class AvatarXML { - private readonly _ink: number; - private readonly _foreground: string; - private readonly _background: string; - - constructor(avatarXML: any) { - const attributes = avatarXML.$; - - this._ink = attributes.ink; - this._foreground = attributes.foreground; - this._background = attributes.background; - } - - get ink(): number { - return this._ink; - } - - get foreground(): string { - return this._foreground; - } - - get background(): string { - return this._background; - } -} - -export class SpriteXML { - private readonly _id: string; - private readonly _member: string; - private readonly _directions: number; - private readonly _staticY: number; - private readonly _ink: number; - - private readonly _directionList: Array; - - constructor(spriteXML: any) { - const attributes = spriteXML.$; - - this._id = attributes.id; - this._member = attributes.member; - this._directions = attributes.directions; - this._staticY = attributes.staticY; - this._ink = attributes.ink; - - this._directionList = new Array(); - if (spriteXML.direction !== undefined) { - for (const direction of spriteXML.direction) { - this._directionList.push(new DirectionXML(direction)); - } - } - } - - get id(): string { - return this._id; - } - - get member(): string { - return this._member; - } - - get directions(): number { - return this._directions; - } - - get staticY(): number { - return this._staticY; - } - - get ink(): number { - return this._ink; - } - - get directionList(): Array { - return this._directionList; - } -} - -export class DirectionXML { - private readonly _id: number; - private readonly _dx: number; - private readonly _dy: number; - private readonly _dz: number; - - constructor(directionXML: any) { - const attributes = directionXML.$; - - this._id = attributes.id; - this._dx = attributes.dx; - this._dy = attributes.dy; - this._dz = attributes.dz; - } - - get id(): number { - return this._id; - } - - get dx(): number { - return this._dx; - } - - get dy(): number { - return this._dy; - } - - get dz(): number { - return this._dz; - } -} - -export class RemoveXML { - private readonly _id: string; - - constructor(removeXML: any) { - this._id = removeXML.$.id; - } - - get id(): string { - return this._id; - } -} - -export class AddXML { - private readonly _id: string; - private readonly _align: string; - private readonly _blend: string; - private readonly _ink: number; - private readonly _base: string; - - constructor(addXML: any) { - const attributes = addXML.$; - - this._id = attributes.id; - this._align = attributes.align; - this._blend = attributes.blend; - this._ink = attributes.ink; - this._base = attributes.base; - } - - get id(): string { - return this._id; - } - - get align(): string { - return this._align; - } - - get blend(): string { - return this._blend; - } - - get ink(): number { - return this._ink; - } - - get base(): string { - return this._base; - } -} - -export class FrameXML { - private readonly _repeats: number | undefined; - private readonly _fxs: Array; - private readonly _bodyParts: Array; - - constructor(frameXML: any) { - if (frameXML.$ !== undefined) - this._repeats = frameXML.$.repeats; - - this._fxs = new Array(); - if (frameXML.fx !== undefined) { - for (const fx of frameXML.fx) { - this._fxs.push(new FxXML(fx)); - } - } - - this._bodyParts = new Array(); - if (frameXML.bodypart !== undefined) { - for (const bodypart of frameXML.bodypart) { - this._bodyParts.push(new BodyPartXML(bodypart)); - } - } - } - - get repeats(): number | undefined { - return this._repeats; - } - - get fxs(): Array { - return this._fxs; - } - - get bodyParts(): Array { - return this._bodyParts; - } -} - -export class BodyPartXML { - private readonly _id: string; - private readonly _frame: number; - private readonly _dx: number; - private readonly _dy: number; - private readonly _dz: number; - private readonly _dd: number; - private readonly _action: string; - private readonly _base: string; - - private readonly _items: Array; - - constructor(bodyPartXML: any) { - const attributes = bodyPartXML.$; - - this._id = attributes.id; - this._frame = attributes.frame; - this._dx = attributes.dx; - this._dy = attributes.dy; - this._dz = attributes.dz; - this._dd = attributes.dd; - this._action = attributes.action; - this._base = attributes.base; - - this._items = new Array(); - if (bodyPartXML.item !== undefined) { - for (const item of bodyPartXML.item) { - this._items.push(new ItemXML(item)); - } - } - } - - get id(): string { - return this._id; - } - - get frame(): number { - return this._frame; - } - - get dx(): number { - return this._dx; - } - - get dy(): number { - return this._dy; - } - - get dz(): number { - return this._dz; - } - - get dd(): number { - return this._dd; - } - - get action(): string { - return this._action; - } - - get base(): string { - return this._base; - } - - get items(): Array { - return this._items; - } -} - -export class ItemXML { - private readonly _id: string; - private readonly _base: string; - - constructor(itemXML: any) { - const attributes = itemXML.$; - - this._id = attributes.id; - this._base = attributes.base; - } - - get id(): string { - return this._id; - } - - get base(): string { - return this._base; - } -} - -export class FxXML { - private readonly _id: string; - private readonly _repeats: number; - private readonly _frame: number; - private readonly _dx: number; - private readonly _dy: number; - private readonly _dz: number; - private readonly _dd: number; - private readonly _action: string; - - constructor(fxXML: any) { - const attributes = fxXML.$; - - this._id = attributes.id; - this._repeats = attributes.repeats; - this._frame = attributes.frame; - this._dx = attributes.dx; - this._dy = attributes.dy; - this._dz = attributes.dz; - this._dd = attributes.dd; - this._action = attributes.action; - } - - get id(): string { - return this._id; - } - - get repeats(): number { - return this._repeats; - } - - get frame(): number { - return this._frame; - } - - get dx(): number { - return this._dx; - } - - get dy(): number { - return this._dy; - } - - get dz(): number { - return this._dz; - } - - get dd(): number { - return this._dd; - } - - get action(): string { - return this._action; - } -} - -export class ShadowXML { - private readonly _id: string; - - constructor(shadowXML: any) { - this._id = shadowXML.$.id; - } - - get id(): string { - return this._id; - } -} - -export class DirectionOffsetXML { - private readonly _offset: number; - - constructor(directionXML: any) { - this._offset = directionXML.$.offset; - } - - get offset(): number { - return this._offset; - } -} \ No newline at end of file diff --git a/src/effect/mapper/EffectJsonMapper.ts b/src/effect/mapper/EffectJsonMapper.ts deleted file mode 100644 index 6f4c472..0000000 --- a/src/effect/mapper/EffectJsonMapper.ts +++ /dev/null @@ -1,341 +0,0 @@ -import HabboAssetSWF from "../../swf/HabboAssetSWF"; -import { - Add, - Alias, - Aliases, - Animation, - Animations, - AssetJSON, - AssetsJSON, Avatar, - Bodypart, Direction, DirectionOffset, - EffectJson, - Frame, - Fx, Item, Override, Remove, Shadow, Sprite -} from "./EffectTypes"; -import {ManifestXML} from "./EffectManifestXMLTypes"; -import { - AnimationXML, - BodyPartXML -} from "./EffectAnimationXMLTypes"; -import {singleton} from "tsyringe"; -import EffectDownloader from "../EffectDownloader"; -import BundleProvider from "../../bundle/BundleProvider"; - -@singleton() -export default class EffectJsonMapper { - public static readonly MUST_START_WITH: string = "h_"; - - - public mapXML(habboAssetSWF: HabboAssetSWF, manifest: any, animation: any): EffectJson { - const name = habboAssetSWF.getDocumentClass(); - const result = {} as EffectJson; - result.name = name; - result.type = EffectDownloader.types.get(name) as string; - this.mapManifestXML(new ManifestXML(manifest), result); - EffectJsonMapper.mapAnimationXML(new AnimationXML(animation), result); - - return result; - } - - private mapManifestXML(manifestXML: ManifestXML, output: EffectJson) { - const assets: AssetsJSON = {}; - - for (const assetXML of manifestXML.library.assets) { - if (assetXML.name.startsWith(EffectJsonMapper.MUST_START_WITH)) { - - const asset: AssetJSON = {} as any; - if (assetXML.param != undefined && assetXML.param.value !== undefined) { - asset.x = parseInt(assetXML.param.value.split(",")[0]); - asset.y = parseInt(assetXML.param.value.split(",")[1]); - } - if (BundleProvider.imageSource.has(assetXML.name)) { - asset.source = BundleProvider.imageSource.get(assetXML.name) as string; - } - - assets[assetXML.name] = asset; - } - } - - output.assets = assets; - - if (manifestXML.library.aliases.length > 0 || BundleProvider.imageSource.size > 0) { - const aliases: Aliases = {}; - for (const aliasXML of manifestXML.library.aliases) { - if (aliasXML.name.startsWith(EffectJsonMapper.MUST_START_WITH)) { - const alias: Alias = {} as any; - - alias.link = aliasXML.link; - if (aliasXML.fliph !== undefined) - alias.fliph = parseInt(aliasXML.fliph.toString()); - if (aliasXML.flipv !== undefined) - alias.flipv = parseInt(aliasXML.flipv.toString()); - - aliases[aliasXML.name] = alias; - } - } - - output.aliases = aliases; - } - } - - private static mapAnimationXML(animationXML: AnimationXML, output: EffectJson) { - const animations: Animations = {}; - const animation: Animation = {} as any; - animation.name = animationXML.name; - animation.desc = animationXML.desc; - animation.resetOnToggle = animationXML.resetOnToggle as any; - - const frames: Array = new Array(); - const avatars: Array = new Array(); - const directions: Array = new Array(); - const shadows: Array = new Array(); - const adds: Array = new Array(); - const removes: Array = new Array(); - const sprites: Array = new Array(); - const overrides: Array = new Array(); - if (animationXML.frames.length > 0) { - for (const frameXML of animationXML.frames) { - const fxs: Array = new Array(); - const bodyparts: Array = new Array(); - - const frame: Frame = {} as any; - if (frameXML.fxs.length > 0) { - for (const fxXML of frameXML.fxs) { - const fx: Fx = {} as any; - fx.action = fxXML.action; - - if (fxXML.dx !== undefined) - fx.dx = parseInt(fxXML.dx.toString()); - - if (fxXML.dy !== undefined) - fx.dy = parseInt(fxXML.dy.toString()); - - if (fxXML.dz !== undefined) - fx.dz = parseInt(fxXML.dz.toString()); - - if (fxXML.dd !== undefined) - fx.dd = parseInt(fxXML.dd.toString()); - - if (fxXML.frame !== undefined) - fx.frame = parseInt(fxXML.frame.toString()); - fx.id = fxXML.id; - - fxs.push(fx); - } - } - if (frameXML.bodyParts.length > 0) { - for (const bodypartXML of frameXML.bodyParts) { - const items: Array = new Array(); - const bodypart: Bodypart = {} as any; - if (bodypartXML.items.length > 0) { - for (const itemXML of bodypartXML.items) { - const item: Item = {} as any; - item.id = itemXML.id; - item.base = itemXML.base; - - items.push(item); - } - } - bodypart.action = bodypartXML.action; - - if (bodypartXML.dx !== undefined) - bodypart.dx = parseInt(bodypartXML.dx.toString()); - - if (bodypartXML.dy !== undefined) - bodypart.dy = parseInt(bodypartXML.dy.toString()); - - if (bodypartXML.dz !== undefined) - bodypart.dz = parseInt(bodypartXML.dz.toString()); - - if (bodypartXML.dd !== undefined) - bodypart.dd = parseInt(bodypartXML.dd.toString()); - - if (bodypartXML.frame !== undefined) - bodypart.frame = parseInt(bodypartXML.frame.toString()); - bodypart.id = bodypartXML.id; - bodypart.base = bodypartXML.base; - bodypart.items = items; - - bodyparts.push(bodypart); - } - } - if (frameXML.repeats !== undefined) frame.repeats = parseInt(frameXML.repeats.toString()); - frame.fxs = fxs; - frame.bodyparts = bodyparts; - frames.push(frame); - } - } - if (animationXML.avatars.length > 0) { - for (const avatarXML of animationXML.avatars) { - const avatar: Avatar = {} as any; - avatar.background = avatarXML.background; - avatar.foreground = avatarXML.foreground; - - if (avatarXML.ink !== undefined) - avatar.ink = parseInt(avatarXML.ink.toString()); - - avatars.push(avatar); - } - } - if (animationXML.directions.length > 0) { - for (const directionXML of animationXML.directions) { - const direction: DirectionOffset = {} as any; - direction.offset = parseInt(directionXML.offset.toString()); - - directions.push(direction); - } - } - if (animationXML.shadows.length > 0) { - for (const shadowXML of animationXML.shadows) { - const shadow: Shadow = {} as any; - shadow.id = shadowXML.id; - - shadows.push(shadow); - } - } - if (animationXML.adds.length > 0) { - for (const addXML of animationXML.adds) { - const add: Add = {} as any; - add.id = addXML.id; - add.align = addXML.align; - add.blend = addXML.blend; - - if (addXML.ink !== undefined) - add.ink = parseInt(addXML.ink.toString()); - add.base = addXML.base; - - adds.push(add); - } - } - if (animationXML.removes.length > 0) { - for (const removeXML of animationXML.removes) { - const remove: Remove = {} as any; - remove.id = removeXML.id; - - removes.push(remove); - } - } - if (animationXML.sprites.length > 0) { - for (const spriteXML of animationXML.sprites) { - const sprite: Sprite = {} as any; - const directions2: Array = new Array(); - if (spriteXML.directionList.length > 0) { - for (const directionXML of spriteXML.directionList) { - const direction: Direction = {} as any; - direction.id = parseInt(directionXML.id.toString()); - - if (directionXML.dx !== undefined) - direction.dx = parseInt(directionXML.dx.toString()); - - if (directionXML.dy !== undefined) - direction.dy = parseInt(directionXML.dy.toString()); - - if (directionXML.dz !== undefined) - direction.dz = parseInt(directionXML.dz.toString()); - - directions2.push(direction); - } - } - sprite.directionList = directions2; - - if (spriteXML.directions !== undefined) - sprite.directions = parseInt(spriteXML.directions.toString()); - sprite.id = spriteXML.id; - - if (spriteXML.ink !== undefined) - sprite.ink = parseInt(spriteXML.ink.toString()); - - if (spriteXML.member !== undefined) - sprite.member = spriteXML.member; - - if (spriteXML.staticY !== undefined) - sprite.staticY = parseInt(spriteXML.staticY.toString()); - sprites.push(sprite); - } - } - if (animationXML.overrides.length > 0) { - for (const overrideXML of animationXML.overrides) { - const override: Override = {} as any; - override.name = overrideXML.name; - override.override = overrideXML.override; - if (overrideXML.frames.length > 0) { - const overrideFrames: Array = new Array(); - for (const frameXML of overrideXML.frames) { - const fxs: Array = new Array(); - const bodyparts: Array = new Array(); - const frame: Frame = {} as any; - if (frameXML.fxs.length > 0) { - for (const fxXML of frameXML.fxs) { - const fx: Fx = {} as any; - fx.action = fxXML.action; - if (fxXML.dx !== undefined) - fx.dx = parseInt(fxXML.dx.toString()); - if (fxXML.dy !== undefined) - fx.dy = parseInt(fxXML.dy.toString()); - if (fxXML.dz !== undefined) - fx.dz = parseInt(fxXML.dz.toString()); - if (fxXML.dd !== undefined) - fx.dd = parseInt(fxXML.dd.toString()); - - if (fxXML.frame !== undefined) - fx.frame = parseInt(fxXML.frame.toString()); - fx.id = fxXML.id; - - fxs.push(fx); - } - } - if (frameXML.bodyParts.length > 0) { - for (const bodypartXML of frameXML.bodyParts) { - const items: Array = new Array(); - const bodypart: Bodypart = {} as any; - if (bodypartXML.items.length > 0) { - for (const itemXML of bodypartXML.items) { - const item: Item = {} as any; - item.id = itemXML.id; - item.base = itemXML.base; - - items.push(item); - } - } - bodypart.action = bodypartXML.action; - - if (bodypartXML.dx !== undefined) - bodypart.dx = parseInt(bodypartXML.dx.toString()); - if (bodypartXML.dy !== undefined) - bodypart.dy = parseInt(bodypartXML.dy.toString()); - if (bodypartXML.dz !== undefined) - bodypart.dz = parseInt(bodypartXML.dz.toString()); - if (bodypartXML.dd !== undefined) - bodypart.dd = parseInt(bodypartXML.dd.toString()); - - if (bodypartXML.frame !== undefined) - bodypart.frame = parseInt(bodypartXML.frame.toString()); - bodypart.id = bodypartXML.id; - bodypart.base = bodypartXML.base; - bodypart.items = items; - - bodyparts.push(bodypart); - } - } - frame.fxs = fxs; - frame.bodyparts = bodyparts; - overrideFrames.push(frame); - } - override.frames = overrideFrames; - overrides.push(override); - } - } - } - animation.frames = frames; - animation.shadows = shadows; - animation.adds = adds; - animation.directions = directions; - animation.avatars = avatars; - animation.removes = removes; - animation.sprites = sprites; - animation.overrides = overrides; - animations[output.name] = animation; - - output.animations = animations; - } -} \ No newline at end of file diff --git a/src/effect/mapper/EffectManifestXMLTypes.ts b/src/effect/mapper/EffectManifestXMLTypes.ts deleted file mode 100644 index 8df16af..0000000 --- a/src/effect/mapper/EffectManifestXMLTypes.ts +++ /dev/null @@ -1,142 +0,0 @@ -export class ManifestXML { - private readonly _library: LibraryXML; - - constructor(manifestXML: any) { - this._library = new LibraryXML(manifestXML.manifest.library[0]); - } - - get library(): LibraryXML { - return this._library; - } -} - -export class LibraryXML { - private readonly _name: string; - private readonly _version: string; - - private readonly _assets: Array; - private readonly _aliases: Array; - - constructor(libraryXML: any) { - const attributes = libraryXML.$; - this._name = attributes.id; - this._version = attributes.version; - - this._assets = new Array(); - if (libraryXML.assets !== undefined) { - for (const assetParent of libraryXML.assets) { - for (const asset of assetParent.asset) { - this._assets.push(new AssetXML(asset)); - } - } - } - - this._aliases = new Array(); - if (libraryXML.aliases !== undefined && Array.isArray(libraryXML.aliases)) { - for (const aliasParent of libraryXML.aliases) { - if (Array.isArray(aliasParent.alias)) { - for (const alias of aliasParent.alias) { - this._aliases.push(new AliasXML(alias)); - } - } - } - } - } - - get name(): string { - return this._name; - } - - get version(): string { - return this._version; - } - - get assets(): Array { - return this._assets; - } - - get aliases(): Array { - return this._aliases; - } -} - -export class AliasXML { - private readonly _name: string; - private readonly _link: string; - private readonly _fliph: number; - private readonly _flipv: number; - - constructor(aliasXML: any) { - const attributes = aliasXML.$; - - this._name = attributes.name; - this._link = attributes.link; - this._fliph = attributes.fliph; - this._flipv = attributes.flipv; - } - - get name(): string { - return this._name; - } - - get link(): string { - return this._link; - } - - get fliph(): number { - return this._fliph; - } - - get flipv(): number { - return this._flipv; - } -} - -export class AssetXML { - private readonly _name: string; - private readonly _mimeType: string; - private readonly _param: ParamXML | undefined; - - constructor(assetXML: any) { - const attributes = assetXML.$; - this._name = attributes.name; - this._mimeType = attributes.mimeType; - - if (assetXML.param !== undefined) { - for (const param of assetXML.param) { - this._param = new ParamXML(param); - } - } - } - - get name(): string { - return this._name; - } - - get mimeType(): string { - return this._mimeType; - } - - get param(): ParamXML | undefined { - return this._param; - } -} - -export class ParamXML { - private readonly _key: string; - private readonly _value: string; - - constructor(paramXML: any) { - const attributes = paramXML.$; - this._key = attributes.key; - this._value = attributes.value; - } - - get key(): string { - return this._key; - } - - get value(): string { - return this._value; - } -} \ No newline at end of file diff --git a/src/effect/mapper/EffectTypes.ts b/src/effect/mapper/EffectTypes.ts deleted file mode 100644 index f23e133..0000000 --- a/src/effect/mapper/EffectTypes.ts +++ /dev/null @@ -1,135 +0,0 @@ -import {SpriteSheetType} from "../../bundle/BundleTypes"; - -export interface EffectJson { - type: string, - name: string, - spritesheet: SpriteSheetType, - - assets: AssetsJSON, - aliases: Aliases, - animations: Animations -} - -export interface Animations { - [key: string]: Animation -} - -export interface Animation { - name: string, - desc: string, - resetOnToggle: boolean, - - directions: Array, - shadows: Array, - adds: Array, - removes: Array, - sprites: Array, - frames: Array, - avatars: Array, - overrides: Array -} - -export interface Override { - name: string, - override: string, - - frames: Array; -} - -export interface Avatar { - ink: number, - foreground: string, - background: string -} - -export interface Frame { - repeats: number, - - fxs: Array, - bodyparts: Array -} - -export interface Bodypart { - id: string, - frame: number, - dx: number, - dy: number, - dz: number, - dd: number, - action: string, - base: string, - - items: Array -} - -export interface Item { - id: string, - base: string -} - -export interface Fx { - id: string, - frame: number, - dx: number, - dy: number, - dz: number, - dd: number, - action: string -} - -export interface Sprite { - id: string, - member: string, - directions: number, - staticY: number, - ink: number, - - directionList: Array; -} - -export interface Direction { - id: number, - dx: number, - dy: number, - dz: number, -} - -export interface Remove { - id: string -} - -export interface Add { - id: string, - align: string, - blend: string, - ink: number, - base: string -} - -export interface Shadow { - id: string -} - -export interface DirectionOffset { - offset: number -} - -export interface Aliases { - [key: string]: Alias -} - -export interface Alias { - link: string, - fliph: number, - flipv: number -} - -export interface AssetsJSON { - [key: string]: AssetJSON; -} - -export interface AssetJSON { - source: string, - x: number, - y: number, -} \ No newline at end of file diff --git a/src/figure/FigureConverter.ts b/src/figure/FigureConverter.ts deleted file mode 100644 index a653501..0000000 --- a/src/figure/FigureConverter.ts +++ /dev/null @@ -1,97 +0,0 @@ -import {singleton} from "tsyringe"; -import HabboAssetSWF from "../swf/HabboAssetSWF"; -import FigureJsonMapper from "./mapper/FigureJsonMapper"; -import Configuration from "../config/Configuration"; -import {FigureJson} from "./mapper/FigureJsonType"; -import DefineBinaryDataTag from "../swf/tags/DefineBinaryDataTag"; -import BundleTypes from "../bundle/BundleTypes"; -import File from "../utils/File"; -import NitroBundle from "../utils/NitroBundle"; -import BundleProvider from "../bundle/BundleProvider"; -import FigureDownloader from "./FigureDownloader"; -import Logger from "../utils/Logger"; - -const xml2js = require('xml2js'); -const parser = new xml2js.Parser(/* options */); -const fs = require('fs').promises; - -@singleton() -export default class FigureConverter { - - constructor( - private readonly _figureDownloader: FigureDownloader, - private readonly _figureJsonMapper: FigureJsonMapper, - private readonly _config: Configuration, - private readonly _bundleProvider: BundleProvider, - private readonly _logger: Logger) { - } - - private getBinaryData(habboAssetSWF: HabboAssetSWF, type: string, documentNameTwice: boolean) { - let binaryName: string = habboAssetSWF.getFullClassName(type, documentNameTwice); - let tag = habboAssetSWF.getBinaryTagByName(binaryName); - if (tag === null) { - binaryName = habboAssetSWF.getFullClassNameSnake(type, documentNameTwice, true); - tag = habboAssetSWF.getBinaryTagByName(binaryName); - } - - return tag; - } - - private async convertXML2JSON(habboAssetSWF: HabboAssetSWF): Promise { - const manifestXML: DefineBinaryDataTag | null = this.getBinaryData(habboAssetSWF, "manifest", false); - if (manifestXML !== null) { - const result = await parser.parseStringPromise(manifestXML.binaryData); - - return this._figureJsonMapper.mapXML(habboAssetSWF, result); - } - - return null; - } - - private async fromHabboAsset(habboAssetSWF: HabboAssetSWF, outputFolder: string, type: string, archiveType: BundleTypes) { - const manifestJson = await this.convertXML2JSON(habboAssetSWF); - if (manifestJson !== null) { - manifestJson.spritesheet = archiveType.spriteSheetType; - - const path = outputFolder + "/" + habboAssetSWF.getDocumentClass() + ".nitro"; - const assetOuputFolder = new File(path); - if (assetOuputFolder.exists()) { - console.log("Figure already exists or the directory is not empty!"); - - return; - } - - const nitroBundle = new NitroBundle(); - nitroBundle.addFile(habboAssetSWF.getDocumentClass() + ".json", Buffer.from(JSON.stringify(manifestJson))); - nitroBundle.addFile(archiveType.imageData.name, archiveType.imageData.buffer); - - const buffer = await nitroBundle.toBufferAsync(); - await fs.writeFile(path, buffer); - } - } - - public async convertAsync() { - const outputFolderFigure = new File(this._config.getValue("output.folder.figure")); - if (!outputFolderFigure.isDirectory()) { - outputFolderFigure.mkdirs(); - } - - const figureConverter = this; - - await this._figureDownloader.download(async function (habboAssetSwf: HabboAssetSWF) { - - console.log("Attempt parsing figure: " + habboAssetSwf.getDocumentClass()); - - try { - const spriteSheetType = await figureConverter._bundleProvider.generateSpriteSheet(habboAssetSwf, outputFolderFigure.path, "figure"); - if (spriteSheetType !== null) - await figureConverter.fromHabboAsset(habboAssetSwf, outputFolderFigure.path, "figure", spriteSheetType); - - } catch (e) { - await figureConverter._logger.logErrorAsync("Figure error: " + habboAssetSwf.getDocumentClass() + e); - console.log("Figure error: " + habboAssetSwf.getDocumentClass()); - console.log(e); - } - }); - } -} \ No newline at end of file diff --git a/src/figure/FigureDownloader.ts b/src/figure/FigureDownloader.ts deleted file mode 100644 index 60a4306..0000000 --- a/src/figure/FigureDownloader.ts +++ /dev/null @@ -1,81 +0,0 @@ -import Configuration from "../config/Configuration"; -import HabboAssetSWF from "../swf/HabboAssetSWF"; -import File from "../utils/File"; -import {singleton} from "tsyringe"; -import Logger from "../utils/Logger"; - -const fetch = require('node-fetch'); -const xml2js = require('xml2js'); -const parser = new xml2js.Parser(/* options */); - -@singleton() -export default class FigureDownloader { - - constructor( - private readonly _config: Configuration, - private readonly _logger: Logger) { - } - - - public static types: Map = new Map(); - - public async download(callback: (habboAssetSwf: HabboAssetSWF) => Promise) { - const outputFolderFigure = this._config.getValue("output.folder.figure"); - const figureMap = await this.parseFigureMap(); - const map = figureMap.map; - - for (const lib of map.lib) { - const info = lib['$']; - const className: string = info.id.split("\\*")[0]; - if (className === "hh_human_fx" || className === "hh_pets") { - continue; - } - - const assetOutputFolder = new File(outputFolderFigure + "/" + className); - if (assetOutputFolder.exists()) { - continue; - } - - if (!FigureDownloader.types.has(className)) { - - const url = this._config.getValue("dynamic.download.url.figure").replace("%className%", className); - let buffer: Buffer | null = null; - - if (url.includes("http")) { - const fetchData = await fetch(url); - if (fetchData.status === 404) { - console.log("SWF File does not exist: " + url); - continue; - } - - const arrayBuffer = await fetchData.arrayBuffer(); - buffer = Buffer.from(arrayBuffer); - } else { - const file = new File(url); - if (!file.exists()) { - console.log("SWF File does not exist: " + file.path); - continue; - } - } - - try { - const newHabboAssetSWF: HabboAssetSWF = new HabboAssetSWF(buffer !== null ? buffer : url); - await newHabboAssetSWF.setupAsync(); - - FigureDownloader.types.set(className, lib.part[0]['$'].type); - await callback(newHabboAssetSWF); - } catch (e) { - await this._logger.logErrorAsync("[" + className + "]" + e); - } - } - } - } - - async parseFigureMap() { - const figureMapPath = this._config.getValue("figuremap.url"); - const figureFetch = await fetch(figureMapPath); - const figureMap = await figureFetch.text(); - - return await parser.parseStringPromise(figureMap); - } -} \ No newline at end of file diff --git a/src/figure/mapper/FigureJsonMapper.ts b/src/figure/mapper/FigureJsonMapper.ts deleted file mode 100644 index 15fcbc0..0000000 --- a/src/figure/mapper/FigureJsonMapper.ts +++ /dev/null @@ -1,81 +0,0 @@ -import Configuration from "../../config/Configuration"; -import HabboAssetSWF from "../../swf/HabboAssetSWF"; -import {FigureAsset, FigureAssets, FigureJson} from "./FigureJsonType"; -import {FigureXMLManifest} from "./FigureXMLTypes"; -import FigureDownloader from "../FigureDownloader"; -import {singleton} from "tsyringe"; -import BundleProvider from "../../bundle/BundleProvider"; - -@singleton() -export default class FigureJsonMapper { - - private static MUST_START_WITH: string = "h_"; - - constructor( - private readonly _config: Configuration - ) { - } - - - public mapXML(habboAssetSWF: HabboAssetSWF, manifestXML: any): FigureJson { - const name = habboAssetSWF.getDocumentClass(); - - return { - name: name, - type: FigureDownloader.types.get(name) as string, - assets: this.mapManifestXML(habboAssetSWF, manifestXML), - spritesheet: null as any - }; - } - - private mapManifestXML(habboAssetSWF: HabboAssetSWF, manifestXML: any): FigureAssets { - const assets: any = {}; - - const figureXMLManifest: FigureXMLManifest = new FigureXMLManifest(manifestXML.manifest); - for (const asset of figureXMLManifest.library.assets) { - const name = asset.name; - if (name.startsWith(FigureJsonMapper.MUST_START_WITH)) { - let hasImage = false; - for (const imageTag of habboAssetSWF.imageTags()) { - if (imageTag.className.includes(name)) { - hasImage = true; - } - } - - if (hasImage || !this._config.getBoolean("figure.skip.non-existing.asset.images")) { - const figureAsset: FigureAsset = {} as any; - figureAsset.name = name; - figureAsset.x = parseFloat(asset.param.value.split(',')[0]); - figureAsset.y = parseFloat(asset.param.value.split(',')[1]); - - if (BundleProvider.imageSource.has(name)) { - figureAsset.source = BundleProvider.imageSource.get(name) as string; - } - - assets[name] = figureAsset; - /*FigureJSON.Asset asset = new FigureJSON.Asset(); - if (FFConverter.getConfig().getBoolean("figure.rotation.enabled")) { - String[] names = assetXML.getName().split("_"); - if (this.isInteger(names[4])) { - String firstName = names[0] + "_" + names[1] + "_" + names[2] + "_" + names[3] + "_%ROTATION%_" + names[5]; - Integer rotation = Integer.parseInt(names[4]); - if (rotation >= 0 && rotation < 8) { - if (assetRotations.containsKey(firstName)) { - assetRotations.get(firstName).add(rotation); - } else { - List rotations = new ArrayList(); - rotations.add(rotation); - assetRotations.put(firstName, rotations); - } - } - } - }*/ - } else { - console.log("Image " + name + " did not decompile for some reason"); - } - } - } - - return assets; - } -} \ No newline at end of file diff --git a/src/figure/mapper/FigureJsonType.ts b/src/figure/mapper/FigureJsonType.ts deleted file mode 100644 index b215c05..0000000 --- a/src/figure/mapper/FigureJsonType.ts +++ /dev/null @@ -1,20 +0,0 @@ -import {SpriteSheetType} from "../../bundle/BundleTypes"; - -export interface FigureJson { - type: string, - name: string, - spritesheet: SpriteSheetType, - assets: FigureAssets -} - -export interface FigureAssets { - [key: string]: FigureAsset -} - -export interface FigureAsset { - name: string, - source: string, - x: number, - y: number, - flipH: boolean -} \ No newline at end of file diff --git a/src/figure/mapper/FigureXMLTypes.ts b/src/figure/mapper/FigureXMLTypes.ts deleted file mode 100644 index f79fe79..0000000 --- a/src/figure/mapper/FigureXMLTypes.ts +++ /dev/null @@ -1,59 +0,0 @@ -export class FigureXMLManifest { - private readonly _library: FigureXMLLibrary; - - constructor(manifestXML: any) { - this._library = new FigureXMLLibrary(manifestXML.library[0]); - } - - get library(): FigureXMLLibrary { - return this._library; - } -} - -export class FigureXMLLibrary { - - private readonly _assets: FigureXMLAsset[]; - - constructor(libraryXML: any) { - this._assets = []; - for (const assetObj of libraryXML.assets) { - for (const asset of assetObj.asset) { - this._assets.push(new FigureXMLAsset(asset)); - } - } - } - - get assets(): FigureXMLAsset[] { - return this._assets; - } -} - -export class FigureXMLAsset { - private readonly _name: string; - private readonly _param: FigureXMLParam; - - constructor(assetXML: any) { - this._name = assetXML.$.name; - this._param = new FigureXMLParam(assetXML.param[0]); - } - - get name(): string { - return this._name; - } - - get param(): FigureXMLParam { - return this._param; - } -} - -export class FigureXMLParam { - private readonly _value: string; - - constructor(paramXML: any) { - this._value = paramXML.$.value; - } - - get value(): string { - return this._value; - } -} \ No newline at end of file diff --git a/src/furniture/FurnitureConverter.ts b/src/furniture/FurnitureConverter.ts deleted file mode 100644 index 58b074a..0000000 --- a/src/furniture/FurnitureConverter.ts +++ /dev/null @@ -1,129 +0,0 @@ -import FurniJsonMapper from "./mapper/FurniJsonMapper"; -import Configuration from "../config/Configuration"; -import HabboAssetSWF from "../swf/HabboAssetSWF"; -import DefineBinaryDataTag from "../swf/tags/DefineBinaryDataTag"; -import {FurniJson} from "./mapper/FurniTypes"; -import BundleTypes from "../bundle/BundleTypes"; -import File from "../utils/File"; -import NitroBundle from "../utils/NitroBundle"; -import BundleProvider from "../bundle/BundleProvider"; -import FurnitureDownloader from "./FurnitureDownloader"; -import {singleton} from "tsyringe"; -import Logger from "../utils/Logger"; - -const xml2js = require('xml2js'); -const parser = new xml2js.Parser(/* options */); - -const fs = require('fs').promises; - -@singleton() -export default class FurnitureConverter { - - constructor( - private readonly _furniDownloader: FurnitureDownloader, - private readonly _furniJsonMapper: FurniJsonMapper, - private readonly _config: Configuration, - private readonly _bundleProvider: BundleProvider, - private readonly _logger: Logger) { - } - - private static getBinaryData(habboAssetSWF: HabboAssetSWF, type: string, documentNameTwice: boolean) { - let binaryName: string = habboAssetSWF.getFullClassName(type, documentNameTwice); - let tag = habboAssetSWF.getBinaryTagByName(binaryName); - if (tag === null) { - binaryName = habboAssetSWF.getFullClassNameSnake(type, documentNameTwice, true); - tag = habboAssetSWF.getBinaryTagByName(binaryName); - } - - return tag; - } - - private static async getAssetsXML(habboAssetSWF: HabboAssetSWF): Promise { - const binaryData: DefineBinaryDataTag | null = FurnitureConverter.getBinaryData(habboAssetSWF, "assets", true); - if (binaryData !== null) { - return await parser.parseStringPromise(binaryData.binaryData); - } - - return null; - } - - private static async getLogicXML(habboAssetSWF: HabboAssetSWF): Promise { - const binaryData: DefineBinaryDataTag | null = FurnitureConverter.getBinaryData(habboAssetSWF, "logic", true); - if (binaryData !== null) { - return await parser.parseStringPromise(binaryData.binaryData); - } - - return null; - } - - private static async getIndexXML(habboAssetSWF: HabboAssetSWF): Promise { - const binaryData: DefineBinaryDataTag | null = FurnitureConverter.getBinaryData(habboAssetSWF, "index", false); - if (binaryData !== null) { - return await parser.parseStringPromise(binaryData.binaryData); - } - - return null; - } - - private static async getVisualizationXML(habboAssetSWF: HabboAssetSWF): Promise { - const binaryData: DefineBinaryDataTag | null = FurnitureConverter.getBinaryData(habboAssetSWF, "visualization", true); - if (binaryData !== null) { - return await parser.parseStringPromise(binaryData.binaryData); - } - - return null; - } - - private async convertXML2JSON(habboAssetSWF: HabboAssetSWF): Promise { - const assetXml = await FurnitureConverter.getAssetsXML(habboAssetSWF); - const logicXml = await FurnitureConverter.getLogicXML(habboAssetSWF); - const indexXml = await FurnitureConverter.getIndexXML(habboAssetSWF); - const visualizationXml = await FurnitureConverter.getVisualizationXML(habboAssetSWF); - - return this._furniJsonMapper.mapXML(assetXml, indexXml, logicXml, visualizationXml); - } - - private async fromHabboAsset(habboAssetSWF: HabboAssetSWF, outputFolder: string, type: string, archiveType: BundleTypes) { - const furnitureJson = await this.convertXML2JSON(habboAssetSWF); - if (furnitureJson !== null) { - furnitureJson.spritesheet = archiveType.spriteSheetType; - furnitureJson.type = type; - - const path = outputFolder + "/" + habboAssetSWF.getDocumentClass() + ".nitro"; - const assetOutputFolder = new File(path); - if (assetOutputFolder.exists()) { - console.log("Furniture already exists or the directory is not empty!"); - - return; - } - - const nitroBundle = new NitroBundle(); - nitroBundle.addFile(habboAssetSWF.getDocumentClass() + ".json", Buffer.from(JSON.stringify(furnitureJson))); - nitroBundle.addFile(archiveType.imageData.name, archiveType.imageData.buffer); - - const buffer = await nitroBundle.toBufferAsync(); - await fs.writeFile(path, buffer); - } - } - - public async convertAsync() { - const outputFolderFurniture = new File(this._config.getValue("output.folder.furniture")); - if (!outputFolderFurniture.isDirectory()) { - outputFolderFurniture.mkdirs(); - } - - const furnitureConverter = this; - await this._furniDownloader.download(async function (habboAssetSwf: HabboAssetSWF, className: string) { - console.log("Attempt parsing furniture: " + habboAssetSwf.getDocumentClass()); - - try { - const spriteSheetType = await furnitureConverter._bundleProvider.generateSpriteSheet(habboAssetSwf, outputFolderFurniture.path, "furniture"); - if (spriteSheetType !== null) { - await furnitureConverter.fromHabboAsset(habboAssetSwf, outputFolderFurniture.path, "furniture", spriteSheetType); - } - } catch (e) { - await furnitureConverter._logger.logErrorAsync("Furniture error: " + habboAssetSwf.getDocumentClass() + " " + e); - } - }); - } -} \ No newline at end of file diff --git a/src/furniture/FurnitureDownloader.ts b/src/furniture/FurnitureDownloader.ts deleted file mode 100644 index f8e0c5c..0000000 --- a/src/furniture/FurnitureDownloader.ts +++ /dev/null @@ -1,116 +0,0 @@ -import HabboAssetSWF from "../swf/HabboAssetSWF"; -import Configuration from "../config/Configuration"; -import {type} from "os"; -import File from "../utils/File"; -import {singleton} from "tsyringe"; -import Logger from "../utils/Logger"; - -const fs = require("fs"); -const fetch = require('node-fetch'); -const xml2js = require('xml2js'); -const parser = new xml2js.Parser(/* options */); -const util = require('util'); - -const readFile = util.promisify(fs.readFile); - -@singleton() -export default class FurnitureDownloader { - - constructor( - private readonly _config: Configuration, - private readonly _logger: Logger) { - } - - public async download(callback: (habboAssetSwf: HabboAssetSWF, className: string) => Promise) { - - const outputFolderFurniture = new File(this._config.getValue("output.folder.furniture")); - - const furniDataObj = await this.parseFurniData(); - const furniData = furniDataObj.furnidata; - - const roomitemtypes = furniData.roomitemtypes; - const wallitemtypes = furniData.wallitemtypes; - - const classNames: Array = new Array(); - for (const roomItem of roomitemtypes) { - for (const furnitype of roomItem.furnitype) { - const attributes = furnitype['$']; - const className = attributes.classname.split("\*")[0]; - const revision = furnitype.revision[0]; - - if (classNames.includes(className)) continue; - else classNames.push(className); - - const assetOuputFolder = new File(outputFolderFurniture.path + "/" + className); - if (assetOuputFolder.isDirectory()) { - continue; - } - - await this.extractFurniture(revision, className, callback); - } - } - - for (const wallItem of wallitemtypes) { - for (const furnitype of wallItem.furnitype) { - const attributes = furnitype['$']; - const className = attributes.classname.split("\*")[0]; - const revision = furnitype.revision[0]; - if (classNames.includes(className)) continue; - else classNames.push(className); - - const assetOuputFolder = new File(outputFolderFurniture + "/" + className); - if (assetOuputFolder.isDirectory()) { - continue; - } - - await this.extractFurniture(revision, className, callback); - } - } - } - - async extractFurniture(revision: string, className: string, callback: (habboAssetSwf: HabboAssetSWF, className: string) => Promise) { - //if (/*className !== 'present_wrap' && */className !== 'holo_dragon') return; - - const url = this._config.getValue("dynamic.download.url.furniture").replace("%revision%", revision).replace("%className%", className); - let buffer: Buffer | null = null; - - if (url.includes("http")) { - const fetchData = await fetch(url); - if (fetchData.status === 404) { - console.log("SWF File does not exist: " + url); - return; - } - - const arrayBuffer = await fetchData.arrayBuffer(); - buffer = Buffer.from(arrayBuffer); - } else { - const file = new File(url); - if (!file.exists()) { - console.log("SWF File does not exist: " + file.path); - return; - } - } - - try { - const newHabboAssetSWF: HabboAssetSWF = new HabboAssetSWF(buffer !== null ? buffer : url); - await newHabboAssetSWF.setupAsync(); - - await callback(newHabboAssetSWF, className); - } catch (e) { - await this._logger.logErrorAsync(`Error with furniture: ${url} \n ${e}`); - } - } - - async parseFurniData() { - const furniDataFetch = this._config.getValue("furnidata.url"); - if (furniDataFetch.includes("http")) { - const furniFetch = await fetch(furniDataFetch); - const furniData = await furniFetch.text(); - - return await parser.parseStringPromise(furniData); - } else { - const content = await readFile(furniDataFetch); - return await parser.parseStringPromise(content); - } - } -} \ No newline at end of file diff --git a/src/furniture/mapper/FurniJsonMapper.ts b/src/furniture/mapper/FurniJsonMapper.ts deleted file mode 100644 index 59fffe4..0000000 --- a/src/furniture/mapper/FurniJsonMapper.ts +++ /dev/null @@ -1,360 +0,0 @@ -import { - Action, - Animation, - AnimationLayer, - AnimationLayers, - Animations, - Color, - ColorLayer, - ColorLayers, - Colors, - Direction, - Directions, - Frame, - Frames, - FrameSequence, - FrameSequences, - FurniAsset, - FurniAssets, - FurniJson, Gesture, Gestures, - Layer, - Offset, Posture, Postures, - Visualization, - VisualizationLayers -} from "./FurniTypes"; -import {AssetsXML, IndexXML, LogicXML} from "./FurniXMLTypes"; -import { - AnimationLayerXML, - AnimationXML, - ColorXML, - LayerXML, - VisualizationDataXML, - VisualizationXML -} from "./VisualizationXMLTypes"; -import BundleProvider from "../../bundle/BundleProvider"; -import {singleton} from "tsyringe"; - -@singleton() -export default class FurniJsonMapper { - private static readonly VISUALIZATION_DEFAULT_SIZE = 64; - - private static readonly VISUALIZATION_ICON_SIZE = 1; - - public mapXML(assets: any, indexXML: any, logic: any, visualization: any): FurniJson { - const furniJson: FurniJson = {} as any; - - this.mapAssetsXML(new AssetsXML(assets), furniJson); - FurniJsonMapper.mapIndexXML(new IndexXML(indexXML.object), furniJson); - FurniJsonMapper.mapLogicXML(new LogicXML(logic.objectData), furniJson); - FurniJsonMapper.mapVisualizationXML(new VisualizationDataXML(visualization.visualizationData), furniJson); - - return furniJson; - } - - - private mapAssetsXML(assetsXML: AssetsXML, output: FurniJson) { - const assets: FurniAssets = {} as any; - - for (const asset of assetsXML.assets) { - if (!asset.name.includes("_32_")) { - const furniAsset: FurniAsset = {} as any; - - if (asset.source !== undefined) { - furniAsset.source = asset.source; - if (BundleProvider.imageSource.has(asset.source)) { - furniAsset.source = BundleProvider.imageSource.get(asset.source) as string; - } - } - - if (BundleProvider.imageSource.has(asset.name)) { - furniAsset.source = BundleProvider.imageSource.get(asset.name) as string; - } - - if (asset.x !== undefined) - furniAsset.x = parseInt(asset.x.toString()); - if (asset.y !== undefined) - furniAsset.y = parseInt(asset.y.toString()); - furniAsset.flipH = asset.flipH as any; - assets[asset.name] = furniAsset; - } - } - - if (Object.keys(assets).length > 0) { - output.assets = assets; - } - } - - private static mapIndexXML(indexXML: IndexXML, output: FurniJson) { - output.name = indexXML.type; - output.logicType = indexXML.logic; - output.visualizationType = indexXML.visualization; - } - - private static mapLogicXML(logicXML: LogicXML, output: FurniJson) { - output.dimensions = { - x: parseInt(logicXML.model.dimensions.x.toString()), - y: parseInt(logicXML.model.dimensions.y.toString()), - z: parseInt(logicXML.model.dimensions.z.toString()) - } - - const directions: Array = []; - if (logicXML.model.directions.length === 0) { - directions.push(0); - } else { - for (const direction of logicXML.model.directions) { - directions.push(parseInt(direction.id.toString())); - } - } - - if (logicXML.action !== undefined) { - const action: Action = {} as any; - if (logicXML.action.link !== undefined) action.link = logicXML.action.link; - if (logicXML.action.startState !== undefined) action.startState = logicXML.action.startState; - - output.action = action; - } - - if (logicXML.mask !== undefined) { - output.maskType = logicXML.mask.type; - } - - if (logicXML.credits !== undefined) { - output.credits = logicXML.credits.value; - } - - output.directions = directions; - } - - private static mapVisualizationXML(visualizationData: VisualizationDataXML, output: FurniJson) { - const visualizationsArray: Array = new Array(); - - for (const visualization of visualizationData.visualizations) { - if (visualization.size == FurniJsonMapper.VISUALIZATION_DEFAULT_SIZE || visualization.size == FurniJsonMapper.VISUALIZATION_ICON_SIZE) { - const visualizationJson: Visualization = {} as any; - visualizationJson.angle = parseInt(visualization.angle.toString()); - visualizationJson.layerCount = parseInt(visualization.layerCount.toString()); - visualizationJson.size = parseInt(visualization.size.toString()); - - FurniJsonMapper.mapVisualizationLayerXML(visualization, visualizationJson); - FurniJsonMapper.mapVisualizationDirectionXML(visualization, visualizationJson); - FurniJsonMapper.mapVisualizationColorXML(visualization, visualizationJson); - FurniJsonMapper.mapVisualizationAnimationXML(visualization, visualizationJson); - FurniJsonMapper.mapVisualizationPostureXML(visualization, visualizationJson); - FurniJsonMapper.mapVisualizationGestureXML(visualization, visualizationJson); - - visualizationsArray.push(visualizationJson); - } - } - - output.visualizations = visualizationsArray; - } - - private static mapVisualizationLayerXML(visXML: VisualizationXML, output: Visualization) { - if (visXML.layers.length > 0) { - output.layers = FurniJsonMapper.mapVisualizationLayersXML(visXML.layers); - } - } - - private static mapVisualizationLayersXML(layersXML: Array): VisualizationLayers { - const layers: VisualizationLayers = {}; - for (const layerXML of layersXML) { - const layer: Layer = {} as any; - if (layerXML.alpha !== undefined) - layer.alpha = parseInt(layerXML.alpha.toString()); - layer.ink = layerXML.ink; - layer.tag = layerXML.tag; - - if (layerXML.x !== undefined) - layer.x = parseInt(layerXML.x.toString()); - if (layerXML.y !== undefined) - layer.y = parseInt(layerXML.y.toString()); - if (layerXML.z !== undefined) - layer.z = parseInt(layerXML.z.toString()); - layer.ignoreMouse = layerXML.ignoreMouse as any; - - layers[layerXML.id] = layer; - } - - return layers; - } - - private static mapVisualizationDirectionXML(visXML: VisualizationXML, output: Visualization) { - if (visXML.directions.length > 0) { - const directions: Directions = {} as any; - for (const directionXML of visXML.directions) { - const direction: Direction = {} as any; - if (directionXML.layers.length > 0) { - direction.layers = FurniJsonMapper.mapVisualizationLayersXML(directionXML.layers); - } - - directions[directionXML.id] = direction; - } - - if (Object.keys(directions).length > 0) { - output.directions = directions; - } - } - } - - private static mapVisualizationColorXML(visXML: VisualizationXML, output: Visualization) { - if (visXML.colors.length > 0) { - const colors: Colors = {}; - for (const colorXML of visXML.colors) { - if (colorXML.layers.length > 0) { - const color: Color = {} as any; - color.layers = FurniJsonMapper.mapVisualizationColorLayerXML(colorXML); - - colors[colorXML.id] = color; - } - } - - if (Object.keys(colors).length > 0) { - output.colors = colors; - } - } - } - - private static mapVisualizationColorLayerXML(colorXML: ColorXML): ColorLayers { - const colorLayers: ColorLayers = {}; - for (const colorLayerXML of colorXML.layers) { - const colorLayer: ColorLayer = {} as any; - colorLayer.color = parseInt(colorLayerXML.color, 16); - - colorLayers[colorLayerXML.id] = colorLayer; - } - - return colorLayers; - } - - private static mapVisualizationAnimationXML(visXML: VisualizationXML, output: Visualization) { - if (visXML.animations.length > 0) { - const animations: Animations = {}; - for (const animationXML of visXML.animations) { - if (animationXML.layers.length > 0) { - const animation: Animation = {} as any; - - if (animationXML.transitionTo !== undefined) - animation.transitionTo = parseInt(animationXML.transitionTo.toString()); - if (animationXML.transitionFrom !== undefined) - animation.transitionFrom = parseInt(animationXML.transitionFrom.toString()); - animation.immediateChangeFrom = animationXML.immediateChangeFrom; - - animation.layers = FurniJsonMapper.mapVisualizationAnimationLayerXML(animationXML); - - animations[animationXML.id] = animation; - } - } - - if (Object.keys(animations).length > 0) { - output.animations = animations; - } - } - } - - private static mapVisualizationAnimationLayerXML(animationXML: AnimationXML): AnimationLayers { - const animationLayers: AnimationLayers = {}; - for (const animationLayerXML of animationXML.layers) { - const animationLayer: AnimationLayer = {} as any; - - if (animationLayerXML.frameRepeat !== undefined) - animationLayer.frameRepeat = parseInt(animationLayerXML.frameRepeat.toString()); - - if (animationLayerXML.loopCount !== undefined) - animationLayer.loopCount = parseInt(animationLayerXML.loopCount.toString()); - - if (animationLayerXML.random !== undefined) - animationLayer.random = parseInt(animationLayerXML.random.toString()); - - if (animationLayerXML.frameSequences.length > 0) { - animationLayer.frameSequences = FurniJsonMapper.mapVisualizationFrameSequenceXML(animationLayerXML); - animationLayers[animationLayerXML.id] = animationLayer; - } - } - - return animationLayers; - } - - private static mapVisualizationFrameSequenceXML(animationLayerXML: AnimationLayerXML): FrameSequences { - const frameSequences: FrameSequences = {}; - let frameSequenceCount = 0; - for (const frameSequenceXML of animationLayerXML.frameSequences) { - const frameSequence: FrameSequence = {} as any; - - if (frameSequenceXML.frames.length > 0) { - let frameId = 0; - const frames: Frames = {}; - for (const frameXML of frameSequenceXML.frames) { - const frame: Frame = {} as any; - if (frameXML.x !== undefined) - frame.x = parseInt(frameXML.x.toString()); - if (frameXML.y !== undefined) - frame.y = parseInt(frameXML.y.toString()); - - if (frameXML.randomX !== undefined) - frame.randomX = parseInt(frameXML.randomX.toString()); - - if (frameXML.randomY !== undefined) - frame.randomY = parseInt(frameXML.randomY.toString()); - if (frameXML.id === "NaN") { - frame.id = 0; - } else { - frame.id = parseInt(frameXML.id); - } - if (frameXML.offsets.length > 0) { - const offsets: Array = new Array(); - for (const offsetXML of frameXML.offsets) { - const offset: Offset = {} as any; - offset.direction = offsetXML.direction; - offset.x = offsetXML.x; - offset.y = offsetXML.y; - offsets.push(offset); - } - frame.offsets = offsets; - } - frames[frameId] = frame; - frameId++; - } - frameSequence.loopCount = frameSequenceXML.loopCount; - frameSequence.random = frameSequenceXML.random; - frameSequence.frames = frames; - frameSequences[frameSequenceCount] = frameSequence; - } - frameSequenceCount++; - } - - return frameSequences; - } - - private static mapVisualizationPostureXML(visXML: VisualizationXML, output: Visualization) { - if (visXML.postures.length > 0) { - const postures: Postures = {}; - for (const postureXML of visXML.postures) { - const posture: Posture = {} as any; - posture.id = postureXML.id; - posture.animationId = postureXML.animationId; - - postures[postureXML.id] = posture; - } - - if (Object.keys(postures).length > 0) { - output.postures = postures; - } - } - } - - private static mapVisualizationGestureXML(visXML: VisualizationXML, output: Visualization) { - if (visXML.gestures.length > 0) { - const gestures: Gestures = {}; - for (const gestureXML of visXML.gestures) { - const gesture: Gesture = {} as any; - gesture.id = gestureXML.id; - gesture.animationId = gestureXML.animationId; - gestures[gestureXML.id] = gesture; - } - - if (Object.keys(gestures).length > 0) { - output.gestures = gestures; - } - } - } -} \ No newline at end of file diff --git a/src/furniture/mapper/FurniTypes.ts b/src/furniture/mapper/FurniTypes.ts deleted file mode 100644 index 0e13ec3..0000000 --- a/src/furniture/mapper/FurniTypes.ts +++ /dev/null @@ -1,164 +0,0 @@ -import {SpriteSheetType} from "../../bundle/BundleTypes"; - -export interface FurniJson { - type: string, - name: string, - visualizationType: string, - logicType: string, - maskType: string, - credits: string, - - spritesheet: SpriteSheetType, - - dimensions: Dimensions, - action: Action; - directions: number[], - assets: FurniAssets, - visualizations: Visualization[] -} - -export interface Visualization { - layerCount: number, - angle: number, - size: number, - - layers: VisualizationLayers, - directions: Directions, - colors: Colors, - animations: Animations, - postures: Postures; - gestures: Gestures -} - -export interface Gestures { - [key: string]: Gesture -} - -export interface Gesture { - id: string, - animationId: number -} - -export interface Postures { - [key: string]: Posture -} - -export interface Posture { - id: string, - animationId: number -} - -export interface Offset { - direction: number, - x: number, - y: number -} - -export interface Frame { - id: number, - x: number, - y: number, - randomX: number, - randomY: number, - - offsets: Offset[] -} - -export interface Frames { - [key: number]: Frame -} - -export interface FrameSequence { - loopCount: number, - random: number, - - frames: Frames -} - -export interface FrameSequences { - [key: number]: FrameSequence -} - -export interface AnimationLayer { - loopCount: number, - frameRepeat: number, - random: number, - - frameSequences: FrameSequences -} - -export interface AnimationLayers { - [key: number]: AnimationLayer -} - -export interface Animations { - [key: number]: Animation -} - -export interface Animation { - transitionTo: number, - transitionFrom: number, - immediateChangeFrom: string, - - layers: AnimationLayers; -} - -export interface ColorLayers { - [key: number]: ColorLayer -} - -export interface ColorLayer { - color: number -} - -export interface Colors { - [key: number]: Color -} - -export interface Color { - layers: ColorLayers; -} - -export interface Directions { - [key: number]: Direction -} - -export interface Direction { - layers: VisualizationLayers; -} - -export interface VisualizationLayers { - [key: number]: Layer -} - -export interface Layer { - alpha: number, - x: number, - y: number, - z: number, - ink: string, - tag: string, - ignoreMouse: boolean -} - -export interface Action { - link: string, - startState: number -} - -export interface Dimensions { - x: number, - y: number, - z: number -} - -export interface FurniAssets { - [key: string]: FurniAsset -} - -export interface FurniAsset { - source: string, - x: number, - y: number, - flipH: boolean -} \ No newline at end of file diff --git a/src/furniture/mapper/FurniXMLTypes.ts b/src/furniture/mapper/FurniXMLTypes.ts deleted file mode 100644 index 7f39fdf..0000000 --- a/src/furniture/mapper/FurniXMLTypes.ts +++ /dev/null @@ -1,247 +0,0 @@ -export class AssetsXML { - private readonly _assets: Array; - - constructor(assetsXML: any) { - this._assets = new Array(); - - for (const asset of assetsXML.assets.asset) { - this._assets.push(new AssetXML(asset)); - } - } - - get assets(): Array { - return this._assets; - } -} - -export class AssetXML { - private readonly _name: string; - private readonly _source: string | undefined; - private readonly _x: number; - private readonly _y: number; - private readonly _flipH: boolean | undefined; - private readonly _usesPalette: number | undefined; - - constructor(asset: any) { - const attributes = asset.$; - - this._name = attributes.name; - - if (attributes.source !== undefined) - this._source = attributes.source; - - this._x = attributes.x; - - this._y = attributes.y; - - if (attributes.flipH !== undefined) - this._flipH = attributes.flipH === '1'; - - if (attributes.usesPalette !== undefined) - this._usesPalette = attributes.usesPalette; - } - - get name(): string { - return this._name; - } - - get source(): string | undefined { - return this._source; - } - - get x(): number { - return this._x; - } - - get y(): number { - return this._y; - } - - get flipH(): boolean | undefined { - return this._flipH; - } - - get usesPalette(): number | undefined { - return this._usesPalette; - } -} - -export class IndexXML { - private readonly _type: string; - private readonly _visualization: string; - private readonly _logic: string; - - constructor(indexXML: any) { - const attributes = indexXML.$; - - this._type = attributes.type; - this._visualization = attributes.visualization; - this._logic = attributes.logic; - } - - get type(): string { - return this._type; - } - - get visualization(): string { - return this._visualization; - } - - get logic(): string { - return this._logic; - } -} - -export class LogicXML { - private readonly _type: string; - private readonly _model: ModelXML; - private readonly _action: ActionXML | undefined; - private readonly _mask: MaskXML | undefined; - private readonly _credits: CreditsXML | undefined; - - constructor(logicXML: any) { - const attributes = logicXML.$; - this._type = attributes.type; - - this._model = new ModelXML(logicXML.model[0]); - if (logicXML.action !== undefined) - this._action = new ActionXML(logicXML.action[0]); - - if (logicXML.mask !== undefined) - this._mask = new MaskXML(logicXML.mask[0]); - - if (logicXML.credits !== undefined) - this._credits = new CreditsXML(logicXML.credits[0]); - } - - get type(): string { - return this._type; - } - - get model(): ModelXML { - return this._model; - } - - get action(): ActionXML | undefined { - return this._action; - } - - get mask(): MaskXML | undefined { - return this._mask; - } - - get credits(): CreditsXML | undefined { - return this._credits; - } -} - -export class ModelXML { - private readonly _dimensions: DimensionsXML; - private readonly _directions: Array; - - constructor(modelXML: any) { - this._dimensions = new DimensionsXML(modelXML.dimensions[0]); - this._directions = new Array(); - - if (Array.isArray(modelXML.directions)) { - for (const directionParent of modelXML.directions) { - if (Array.isArray(directionParent.direction)) { - for (const direction of directionParent.direction) { - this._directions.push(new DirectionXML(direction.$)); - } - } else { - console.log(directionParent.direction); - } - } - } - } - - get dimensions(): DimensionsXML { - return this._dimensions; - } - - get directions(): Array { - return this._directions; - } -} - -export class DimensionsXML { - private readonly _x: number; - private readonly _y: number; - private readonly _z: number; - - constructor(dimensionsXML: any) { - const attributes = dimensionsXML.$; - - this._x = attributes.x; - this._y = attributes.y; - this._z = attributes.z; - } - - get x(): number { - return this._x; - } - - get y(): number { - return this._y; - } - - get z(): number { - return this._z; - } -} - -export class DirectionXML { - private readonly _id: number; - - constructor(directionXML: any) { - this._id = directionXML.id; - } - - get id(): number { - return this._id; - } -} - -export class ActionXML { - private readonly _link: string; - private readonly _startState: number; - - constructor(actionXML: any) { - const attributes = actionXML.$; - this._link = attributes.link; - this._startState = attributes.startState; - } - - get link(): string { - return this._link; - } - - get startState(): number { - return this._startState; - } -} - -export class MaskXML { - private readonly _type: string; - - constructor(maskXML: any) { - this._type = maskXML.$.type; - } - - get type(): string { - return this._type; - } -} - -export class CreditsXML { - private readonly _value: string; - - constructor(creditsXML: any) { - this._value = creditsXML.$.value; - } - - get value(): string { - return this._value; - } -} \ No newline at end of file diff --git a/src/furniture/mapper/VisualizationXMLTypes.ts b/src/furniture/mapper/VisualizationXMLTypes.ts deleted file mode 100644 index 0956cb1..0000000 --- a/src/furniture/mapper/VisualizationXMLTypes.ts +++ /dev/null @@ -1,517 +0,0 @@ -export class VisualizationDataXML { - - private readonly _type: string; - private readonly _visualizations: Array; - - constructor(visualizationXML: any) { - this._type = visualizationXML.$.type; - this._visualizations = new Array(); - - if (Array.isArray(visualizationXML.graphics)) { - for (const graphic of visualizationXML.graphics) { - for (const visualization of graphic.visualization) { - this._visualizations.push(new VisualizationXML(visualization)); - } - } - } - } - - get type(): string { - return this._type; - } - - get visualizations(): Array { - return this._visualizations; - } -} - -export class VisualizationXML { - - private readonly _size: number; - private readonly _layerCount: number; - private readonly _angle: number; - - private readonly _layers: Array; - private readonly _directions: Array; - private readonly _colors: Array; - private readonly _animations: Array; - private readonly _postures: Array; - private readonly _gestures: Array; - - constructor(visualizationXML: any) { - const attributes = visualizationXML.$; - this._size = attributes.size; - this._layerCount = attributes.layerCount; - this._angle = attributes.angle; - - this._layers = new Array(); - if (visualizationXML.layers !== undefined) - for (const layerParent of visualizationXML.layers) { - if (Array.isArray(layerParent.layer)) { - for (const layer of layerParent.layer) { - this._layers.push(new LayerXML(layer)); - } - } - } - - this._directions = new Array(); - if (visualizationXML.directions !== undefined) { - for (const directionParent of visualizationXML.directions) { - if (Array.isArray(directionParent.direction)) { - for (const direction of directionParent.direction) { - this._directions.push(new DirectionXML(direction)); - } - } - } - } - - this._colors = new Array(); - if (visualizationXML.colors !== undefined) { - for (const colorParent of visualizationXML.colors) { - if (Array.isArray(colorParent.color)) { - for (const color of colorParent.color) { - this._colors.push(new ColorXML(color)); - } - } - } - } - - this._animations = new Array(); - if (visualizationXML.animations !== undefined) { - for (const animationParent of visualizationXML.animations) { - if (Array.isArray(animationParent.animation)) { - for (const animation of animationParent.animation) { - this._animations.push(new AnimationXML(animation)); - } - } - } - } - - this._postures = new Array(); - if (visualizationXML.postures !== undefined) { - for (const postureParent of visualizationXML.postures) { - if (Array.isArray(postureParent.posture)) { - for (const posture of postureParent.posture) { - this._postures.push(new PostureXML(posture)); - } - } - } - } - this._gestures = new Array(); - if (visualizationXML.gestures !== undefined) { - for (const gestureParent of visualizationXML.gestures) { - if (Array.isArray(gestureParent.gesture)) { - for (const gesture of gestureParent.gesture) { - this._gestures.push(new GestureXML(gesture)); - } - } - } - } - } - - get size(): number { - return this._size; - } - - get layerCount(): number { - return this._layerCount; - } - - get angle(): number { - return this._angle; - } - - get layers(): Array { - return this._layers; - } - - get directions(): Array { - return this._directions; - } - - get colors(): Array { - return this._colors; - } - - get animations(): Array { - return this._animations; - } - - get postures(): Array { - return this._postures; - } - - get gestures(): Array { - return this._gestures; - } -} - -export class LayerXML { - private readonly _id: number; - private readonly _alpha: number; - private readonly _x: number; - private readonly _y: number; - private readonly _z: number; - private readonly _ink: string; - private readonly _tag: string; - private readonly _ignoreMouse: boolean | undefined; - - constructor(layerXML: any) { - const attributes = layerXML.$; - - this._id = attributes.id; - this._alpha = attributes.alpha; - this._x = attributes.x; - this._y = attributes.y; - this._z = attributes.z; - this._ink = attributes.ink; - this._tag = attributes.tag; - if (attributes.ignoreMouse !== undefined) { - this._ignoreMouse = attributes.ignoreMouse === '1'; - } - } - - get id(): number { - return this._id; - } - - get alpha(): number { - return this._alpha; - } - - get x(): number { - return this._x; - } - - get y(): number { - return this._y; - } - - get z(): number { - return this._z; - } - - get ink(): string { - return this._ink; - } - - get tag(): string { - return this._tag; - } - - get ignoreMouse(): boolean | undefined { - return this._ignoreMouse; - } -} - -export class DirectionXML { - private readonly _id: number; - private readonly _layers: Array; - - constructor(directionXML: any) { - this._id = directionXML.$.id; - - this._layers = new Array(); - if (directionXML.layer !== undefined) { - for (const layer of directionXML.layer) { - this._layers.push(new LayerXML(layer)); - } - } - } - - get id(): number { - return this._id; - } - - get layers(): Array { - return this._layers; - } -} - -export class ColorXML { - private readonly _id: number; - private readonly _layers: Array; - - constructor(colorXML: any) { - this._id = colorXML.$.id; - - this._layers = new Array(); - for (const colorLayer of colorXML.colorLayer) { - this._layers.push(new ColorLayerXML(colorLayer)); - } - } - - - get id(): number { - return this._id; - } - - get layers(): Array { - return this._layers; - } -} - -export class ColorLayerXML { - private readonly _id: number; - private readonly _color: string; - - constructor(colorLayerXML: any) { - const attributes = colorLayerXML.$; - this._id = attributes.id; - this._color = attributes.color; - } - - get id(): number { - return this._id; - } - - get color(): string { - return this._color; - } -} - -export class AnimationXML { - private readonly _id: number; - private readonly _transitionTo: number; - private readonly _transitionFrom: number; - private readonly _immediateChangeFrom: string; - private readonly _layers: Array; - - constructor(animationXML: any) { - const attributes = animationXML.$; - this._id = attributes.id; - this._transitionTo = attributes.transitionTo; - this._transitionFrom = attributes.transitionFrom; - this._immediateChangeFrom = attributes.immediateChangeFrom; - - this._layers = new Array(); - if (animationXML.animationLayer !== undefined) { - for (const animationLayer of animationXML.animationLayer) { - this._layers.push(new AnimationLayerXML(animationLayer)) - } - } - } - - get id(): number { - return this._id; - } - - get transitionTo(): number { - return this._transitionTo; - } - - get transitionFrom(): number { - return this._transitionFrom; - } - - get immediateChangeFrom(): string { - return this._immediateChangeFrom; - } - - get layers(): Array { - return this._layers; - } -} - -export class AnimationLayerXML { - private readonly _id: number; - private readonly _loopCount: number; - private readonly _frameRepeat: number; - private readonly _random: number; - private readonly _randomStart: number; - - private readonly _frameSequences: Array; - - constructor(animationLayerXML: any) { - const attributes = animationLayerXML.$; - this._id = attributes.id; - this._loopCount = attributes.loopCount; - this._frameRepeat = attributes.frameRepeat; - this._random = attributes.random; - this._randomStart = attributes.randomStart; - - this._frameSequences = new Array(); - if (animationLayerXML.frameSequence !== undefined) { - for (const frameSequence of animationLayerXML.frameSequence) { - this._frameSequences.push(new FrameSequenceXML(frameSequence)); - } - } - } - - get id(): number { - return this._id; - } - - get loopCount(): number { - return this._loopCount; - } - - get frameRepeat(): number { - return this._frameRepeat; - } - - get random(): number { - return this._random; - } - - get randomStart(): number { - return this._randomStart; - } - - get frameSequences(): Array { - return this._frameSequences; - } -} - -export class FrameSequenceXML { - private readonly _loopCount: number; - private readonly _random: number; - - private readonly _frames: Array; - - constructor(frameSequenceXML: any) { - let attributes = frameSequenceXML.$; - if (attributes === undefined) attributes = {}; - - this._loopCount = attributes.loopCount; - this._random = attributes.random; - - this._frames = new Array(); - if (frameSequenceXML.frame !== undefined) { - for (const frame of frameSequenceXML.frame) { - this._frames.push(new FrameXML(frame)); - } - } - } - - get loopCount(): number { - return this._loopCount; - } - - get random(): number { - return this._random; - } - - get frames(): Array { - return this._frames; - } -} - -export class FrameXML { - private readonly _id: string; - private readonly _x: number; - private readonly _y: number; - private readonly _randomX: number; - private readonly _randomY: number; - - private readonly _offsets: Array; - - constructor(frameXML: any) { - const attributes = frameXML.$; - - this._id = attributes.id; - this._x = attributes.x; - this._y = attributes.y; - this._randomX = attributes.randomX; - this._randomY = attributes.randomY; - - this._offsets = new Array(); - if (frameXML.offsets !== undefined) { - for (const offsetParent of frameXML.offsets) { - for (const offset of offsetParent.offset) { - this._offsets.push(new OffsetXML(offset)); - } - } - } - } - - get id(): string { - return this._id; - } - - get x(): number { - return this._x; - } - - get y(): number { - return this._y; - } - - get randomX(): number { - return this._randomX; - } - - get randomY(): number { - return this._randomY; - } - - get offsets(): Array { - return this._offsets; - } -} - -export class OffsetXML { - private readonly _direction: number; - private readonly _x: number; - private readonly _y: number; - - constructor(offsetXML: any) { - const attributes = offsetXML.$; - - this._direction = attributes.direction; - this._x = attributes.x; - this._y = attributes.y; - } - - get direction(): number { - return this._direction; - } - - get x(): number { - return this._x; - } - - get y(): number { - return this._y; - } -} - -export class PostureXML { - private readonly _id: string; - private readonly _animationId: number; - - constructor(postureXML: any) { - const attributes = postureXML.$; - - this._id = attributes.id; - this._animationId = attributes.animationId; - } - - get id(): string { - return this._id; - } - - get animationId(): number { - return this._animationId; - } -} - -export class GestureXML { - private readonly _id: string; - private readonly _animationId: number; - - constructor(gestureXML: any) { - const attributes = gestureXML.$; - - this._id = attributes.id; - this._animationId = attributes.animationId; - } - - get id(): string { - return this._id; - } - - get animationId(): number { - return this._animationId; - } -} \ No newline at end of file diff --git a/src/mapping/json/asset/IAsset.ts b/src/mapping/json/asset/IAsset.ts new file mode 100644 index 0000000..f4e4fb4 --- /dev/null +++ b/src/mapping/json/asset/IAsset.ts @@ -0,0 +1,9 @@ +export interface IAsset +{ + source?: string; + x?: number; + y?: number; + flipH?: boolean; + flipV?: boolean; + usesPalette?: boolean; +} diff --git a/src/mapping/json/asset/IAssetAlias.ts b/src/mapping/json/asset/IAssetAlias.ts new file mode 100644 index 0000000..fcfec27 --- /dev/null +++ b/src/mapping/json/asset/IAssetAlias.ts @@ -0,0 +1,6 @@ +export interface IAssetAlias +{ + link: string; + fliph: number; + flipv: number; +} \ No newline at end of file diff --git a/src/mapping/json/asset/IAssetData.ts b/src/mapping/json/asset/IAssetData.ts new file mode 100644 index 0000000..63e5597 --- /dev/null +++ b/src/mapping/json/asset/IAssetData.ts @@ -0,0 +1,23 @@ +import { IAsset } from './IAsset'; +import { IAssetAlias } from './IAssetAlias'; +import { IAssetDimension } from './IAssetDimension'; +import { IAssetPalette } from './IAssetPalette'; +import { ISpritesheetData } from './spritesheet'; +import { IAssetVisualizationData } from './visualization'; + +export interface IAssetData { + type?: string; + name?: string; + visualizationType?: string; + logicType?: string; + maskType?: string; + credits?: string; + action?: { link?: string, startState?: number }; + spritesheet?: ISpritesheetData; + dimensions?: IAssetDimension; + directions?: number[]; + assets?: { [index: string]: IAsset }; + aliases?: { [index: string]: IAssetAlias }; + palettes?: { [index: string]: IAssetPalette }; + visualizations?: IAssetVisualizationData[]; +} diff --git a/src/mapping/json/asset/IAssetDimension.ts b/src/mapping/json/asset/IAssetDimension.ts new file mode 100644 index 0000000..4a4629f --- /dev/null +++ b/src/mapping/json/asset/IAssetDimension.ts @@ -0,0 +1,6 @@ +export interface IAssetDimension +{ + x: number; + y: number; + z?: number; +} \ No newline at end of file diff --git a/src/mapping/json/asset/IAssetPalette.ts b/src/mapping/json/asset/IAssetPalette.ts new file mode 100644 index 0000000..5102e95 --- /dev/null +++ b/src/mapping/json/asset/IAssetPalette.ts @@ -0,0 +1,8 @@ +export interface IAssetPalette +{ + id?: number; + source?: string; + color1?: string; + color2?: string; + rgb?: [ number, number, number ][]; +} diff --git a/src/mapping/json/asset/index.ts b/src/mapping/json/asset/index.ts new file mode 100644 index 0000000..0ec4860 --- /dev/null +++ b/src/mapping/json/asset/index.ts @@ -0,0 +1,7 @@ +export * from './IAsset'; +export * from './IAssetAlias'; +export * from './IAssetData'; +export * from './IAssetDimension'; +export * from './IAssetPalette'; +export * from './spritesheet'; +export * from './visualization'; diff --git a/src/mapping/json/asset/spritesheet/ISpritesheetData.ts b/src/mapping/json/asset/spritesheet/ISpritesheetData.ts new file mode 100644 index 0000000..24389cc --- /dev/null +++ b/src/mapping/json/asset/spritesheet/ISpritesheetData.ts @@ -0,0 +1,8 @@ +import { ISpritesheetFrame } from './ISpritesheetFrame'; +import { ISpritesheetMeta } from './ISpritesheetMeta'; + +export interface ISpritesheetData +{ + meta?: ISpritesheetMeta; + frames?: { [index: string]: ISpritesheetFrame }; +} diff --git a/src/mapping/json/asset/spritesheet/ISpritesheetFrame.ts b/src/mapping/json/asset/spritesheet/ISpritesheetFrame.ts new file mode 100644 index 0000000..0833b50 --- /dev/null +++ b/src/mapping/json/asset/spritesheet/ISpritesheetFrame.ts @@ -0,0 +1,25 @@ +export interface ISpritesheetFrame +{ + frame: { + x: number; + y: number; + w: number; + h: number; + }; + rotated: boolean; + trimmed: boolean; + spriteSourceSize: { + x: number; + y: number; + w: number; + h: number; + }; + sourceSize: { + w: number; + h: number; + }; + pivot: { + x: number; + y: number; + }; +} diff --git a/src/mapping/json/asset/spritesheet/ISpritesheetMeta.ts b/src/mapping/json/asset/spritesheet/ISpritesheetMeta.ts new file mode 100644 index 0000000..3a74f7b --- /dev/null +++ b/src/mapping/json/asset/spritesheet/ISpritesheetMeta.ts @@ -0,0 +1,12 @@ +export interface ISpritesheetMeta +{ + app: string; + version: string; + image: string; + format: string; + size: { + w: number; + h: number; + }; + scale: string; +} diff --git a/src/mapping/json/asset/spritesheet/index.ts b/src/mapping/json/asset/spritesheet/index.ts new file mode 100644 index 0000000..9c94e8b --- /dev/null +++ b/src/mapping/json/asset/spritesheet/index.ts @@ -0,0 +1,3 @@ +export * from './ISpritesheetData'; +export * from './ISpritesheetFrame'; +export * from './ISpritesheetMeta'; diff --git a/src/mapping/json/asset/visualization/IAssetVisualizationData.ts b/src/mapping/json/asset/visualization/IAssetVisualizationData.ts new file mode 100644 index 0000000..f5d37bb --- /dev/null +++ b/src/mapping/json/asset/visualization/IAssetVisualizationData.ts @@ -0,0 +1,19 @@ +import { IAssetAnimation } from './animation/IAssetAnimation'; +import { IAssetColor } from './color/IAssetColor'; +import { IAssetGesture } from './gestures/IAssetGesture'; +import { IAssetVisualizationDirection } from './IAssetVisualizationDirection'; +import { IAssetVisualizationLayer } from './IAssetVisualizationLayer'; +import { IAssetPosture } from './postures/IAssetPosture'; + +export interface IAssetVisualizationData +{ + size?: number; + layerCount?: number; + angle?: number; + layers?: { [index: string]: IAssetVisualizationLayer }; + colors?: { [index: string]: IAssetColor }; + directions?: { [index: string]: IAssetVisualizationDirection }; + animations?: { [index: string]: IAssetAnimation }; + postures?: { [index: string]: IAssetPosture }; + gestures?: { [index: string]: IAssetGesture }; +} diff --git a/src/mapping/json/asset/visualization/IAssetVisualizationDirection.ts b/src/mapping/json/asset/visualization/IAssetVisualizationDirection.ts new file mode 100644 index 0000000..cc628f1 --- /dev/null +++ b/src/mapping/json/asset/visualization/IAssetVisualizationDirection.ts @@ -0,0 +1,6 @@ +import { IAssetVisualizationLayer } from './IAssetVisualizationLayer'; + +export interface IAssetVisualizationDirection +{ + layers?: { [index: string]: IAssetVisualizationLayer }; +} diff --git a/src/mapping/json/asset/visualization/IAssetVisualizationLayer.ts b/src/mapping/json/asset/visualization/IAssetVisualizationLayer.ts new file mode 100644 index 0000000..61fcf56 --- /dev/null +++ b/src/mapping/json/asset/visualization/IAssetVisualizationLayer.ts @@ -0,0 +1,10 @@ +export interface IAssetVisualizationLayer +{ + x?: number; + y?: number; + z?: number; + alpha?: number; + ink?: string; + tag?: string; + ignoreMouse?: boolean; +} \ No newline at end of file diff --git a/src/mapping/json/asset/visualization/animation/IAssetAnimation.ts b/src/mapping/json/asset/visualization/animation/IAssetAnimation.ts new file mode 100644 index 0000000..3201671 --- /dev/null +++ b/src/mapping/json/asset/visualization/animation/IAssetAnimation.ts @@ -0,0 +1,9 @@ +import { IAssetAnimationLayer } from './IAssetAnimationLayer'; + +export interface IAssetAnimation +{ + transitionTo?: number; + transitionFrom?: number; + immediateChangeFrom?: string; + layers?: { [index: string]: IAssetAnimationLayer }; +} diff --git a/src/mapping/json/asset/visualization/animation/IAssetAnimationLayer.ts b/src/mapping/json/asset/visualization/animation/IAssetAnimationLayer.ts new file mode 100644 index 0000000..7786764 --- /dev/null +++ b/src/mapping/json/asset/visualization/animation/IAssetAnimationLayer.ts @@ -0,0 +1,9 @@ +import { IAssetAnimationSequence } from './IAssetAnimationSequence'; + +export interface IAssetAnimationLayer +{ + loopCount?: number; + frameRepeat?: number; + random?: number; + frameSequences?: { [index: string]: IAssetAnimationSequence }; +} diff --git a/src/mapping/json/asset/visualization/animation/IAssetAnimationSequence.ts b/src/mapping/json/asset/visualization/animation/IAssetAnimationSequence.ts new file mode 100644 index 0000000..13bc991 --- /dev/null +++ b/src/mapping/json/asset/visualization/animation/IAssetAnimationSequence.ts @@ -0,0 +1,8 @@ +import { IAssetAnimationSequenceFrame } from './IAssetAnimationSequenceFrame'; + +export interface IAssetAnimationSequence +{ + loopCount?: number; + random?: number; + frames?: { [index: string]: IAssetAnimationSequenceFrame }; +} diff --git a/src/mapping/json/asset/visualization/animation/IAssetAnimationSequenceFrame.ts b/src/mapping/json/asset/visualization/animation/IAssetAnimationSequenceFrame.ts new file mode 100644 index 0000000..ec79331 --- /dev/null +++ b/src/mapping/json/asset/visualization/animation/IAssetAnimationSequenceFrame.ts @@ -0,0 +1,11 @@ +import { IAssetAnimationSequenceFrameOffset } from './IAssetAnimationSequenceFrameOffset'; + +export interface IAssetAnimationSequenceFrame +{ + id?: number; + x?: number; + y?: number; + randomX?: number; + randomY?: number; + offsets?: { [index: string]: IAssetAnimationSequenceFrameOffset }; +} diff --git a/src/mapping/json/asset/visualization/animation/IAssetAnimationSequenceFrameOffset.ts b/src/mapping/json/asset/visualization/animation/IAssetAnimationSequenceFrameOffset.ts new file mode 100644 index 0000000..9ca8ba4 --- /dev/null +++ b/src/mapping/json/asset/visualization/animation/IAssetAnimationSequenceFrameOffset.ts @@ -0,0 +1,6 @@ +export interface IAssetAnimationSequenceFrameOffset +{ + direction?: number; + x?: number; + y?: number; +} diff --git a/src/mapping/json/asset/visualization/animation/index.ts b/src/mapping/json/asset/visualization/animation/index.ts new file mode 100644 index 0000000..7e8a206 --- /dev/null +++ b/src/mapping/json/asset/visualization/animation/index.ts @@ -0,0 +1,5 @@ +export * from './IAssetAnimation'; +export * from './IAssetAnimationLayer'; +export * from './IAssetAnimationSequence'; +export * from './IAssetAnimationSequenceFrame'; +export * from './IAssetAnimationSequenceFrameOffset'; diff --git a/src/mapping/json/asset/visualization/color/IAssetColor.ts b/src/mapping/json/asset/visualization/color/IAssetColor.ts new file mode 100644 index 0000000..29ebc75 --- /dev/null +++ b/src/mapping/json/asset/visualization/color/IAssetColor.ts @@ -0,0 +1,6 @@ +import { IAssetColorLayer } from './IAssetColorLayer'; + +export interface IAssetColor +{ + layers?: { [index: string]: IAssetColorLayer }; +} diff --git a/src/mapping/json/asset/visualization/color/IAssetColorLayer.ts b/src/mapping/json/asset/visualization/color/IAssetColorLayer.ts new file mode 100644 index 0000000..7a1372e --- /dev/null +++ b/src/mapping/json/asset/visualization/color/IAssetColorLayer.ts @@ -0,0 +1,4 @@ +export interface IAssetColorLayer +{ + color?: number; +} diff --git a/src/mapping/json/asset/visualization/color/index.ts b/src/mapping/json/asset/visualization/color/index.ts new file mode 100644 index 0000000..00aff50 --- /dev/null +++ b/src/mapping/json/asset/visualization/color/index.ts @@ -0,0 +1,2 @@ +export * from './IAssetColor'; +export * from './IAssetColorLayer'; diff --git a/src/mapping/json/asset/visualization/gestures/IAssetGesture.ts b/src/mapping/json/asset/visualization/gestures/IAssetGesture.ts new file mode 100644 index 0000000..ddf3752 --- /dev/null +++ b/src/mapping/json/asset/visualization/gestures/IAssetGesture.ts @@ -0,0 +1,5 @@ +export interface IAssetGesture +{ + id?: string; + animationId?: number; +} diff --git a/src/mapping/json/asset/visualization/gestures/index.ts b/src/mapping/json/asset/visualization/gestures/index.ts new file mode 100644 index 0000000..2c6e978 --- /dev/null +++ b/src/mapping/json/asset/visualization/gestures/index.ts @@ -0,0 +1 @@ +export * from './IAssetGesture'; diff --git a/src/mapping/json/asset/visualization/index.ts b/src/mapping/json/asset/visualization/index.ts new file mode 100644 index 0000000..334bddc --- /dev/null +++ b/src/mapping/json/asset/visualization/index.ts @@ -0,0 +1,7 @@ +export * from './animation'; +export * from './color'; +export * from './gestures'; +export * from './IAssetVisualizationData'; +export * from './IAssetVisualizationDirection'; +export * from './IAssetVisualizationLayer'; +export * from './postures'; diff --git a/src/mapping/json/asset/visualization/postures/IAssetPosture.ts b/src/mapping/json/asset/visualization/postures/IAssetPosture.ts new file mode 100644 index 0000000..3313851 --- /dev/null +++ b/src/mapping/json/asset/visualization/postures/IAssetPosture.ts @@ -0,0 +1,5 @@ +export interface IAssetPosture +{ + id?: string; + animationId?: number; +} diff --git a/src/mapping/json/asset/visualization/postures/index.ts b/src/mapping/json/asset/visualization/postures/index.ts new file mode 100644 index 0000000..c24c1b9 --- /dev/null +++ b/src/mapping/json/asset/visualization/postures/index.ts @@ -0,0 +1 @@ +export * from './IAssetPosture'; diff --git a/src/mapping/json/figuremap/IFigureMap.ts b/src/mapping/json/figuremap/IFigureMap.ts new file mode 100644 index 0000000..6a8280e --- /dev/null +++ b/src/mapping/json/figuremap/IFigureMap.ts @@ -0,0 +1,6 @@ +import { IFigureMapLibrary } from './IFigureMapLibrary'; + +export interface IFigureMap +{ + libraries: IFigureMapLibrary[]; +} diff --git a/src/mapping/json/figuremap/IFigureMapLibrary.ts b/src/mapping/json/figuremap/IFigureMapLibrary.ts new file mode 100644 index 0000000..938c20a --- /dev/null +++ b/src/mapping/json/figuremap/IFigureMapLibrary.ts @@ -0,0 +1,8 @@ +import { IFigureMapLibraryPart } from './IFigureMapLibraryPart'; + +export interface IFigureMapLibrary +{ + id: string; + revision: number; + parts: IFigureMapLibraryPart[]; +} diff --git a/src/mapping/json/figuremap/IFigureMapLibraryPart.ts b/src/mapping/json/figuremap/IFigureMapLibraryPart.ts new file mode 100644 index 0000000..f9e5768 --- /dev/null +++ b/src/mapping/json/figuremap/IFigureMapLibraryPart.ts @@ -0,0 +1,5 @@ +export interface IFigureMapLibraryPart +{ + id: number; + type: string; +} diff --git a/src/mapping/json/figuremap/index.ts b/src/mapping/json/figuremap/index.ts new file mode 100644 index 0000000..8e2ea2f --- /dev/null +++ b/src/mapping/json/figuremap/index.ts @@ -0,0 +1,3 @@ +export * from './IFigureMap'; +export * from './IFigureMapLibrary'; +export * from './IFigureMapLibraryPart'; diff --git a/src/mapping/json/furnidata/IFurnitureData.ts b/src/mapping/json/furnidata/IFurnitureData.ts new file mode 100644 index 0000000..319683d --- /dev/null +++ b/src/mapping/json/furnidata/IFurnitureData.ts @@ -0,0 +1,11 @@ +import { IFurnitureType } from './IFurnitureType'; + +export class IFurnitureData +{ + roomitemtypes: { + furnitype: IFurnitureType[] + }; + wallitemtypes: { + furnitype: IFurnitureType[] + }; +} diff --git a/src/mapping/json/furnidata/IFurnitureType.ts b/src/mapping/json/furnidata/IFurnitureType.ts new file mode 100644 index 0000000..bb9664e --- /dev/null +++ b/src/mapping/json/furnidata/IFurnitureType.ts @@ -0,0 +1,28 @@ +export interface IFurnitureType +{ + id: number; + classname: string; + revision: number; + category: string; + defaultdir: number; + xdim: number; + ydim: number; + partcolors: { color: string[] }; + name: string; + description: string; + adurl: string; + offerid: number; + buyout: boolean; + rentofferid: number; + rentbuyout: boolean; + bc: boolean; + excludeddynamic: boolean; + customparams: string; + specialtype: number; + canstandon: boolean; + cansiton: boolean; + canlayon: boolean; + furniline: string; + environment: string; + rare: boolean; +} diff --git a/src/mapping/json/furnidata/index.ts b/src/mapping/json/furnidata/index.ts new file mode 100644 index 0000000..95a2315 --- /dev/null +++ b/src/mapping/json/furnidata/index.ts @@ -0,0 +1,2 @@ +export * from './IFurnitureData'; +export * from './IFurnitureType'; diff --git a/src/mapping/json/index.ts b/src/mapping/json/index.ts new file mode 100644 index 0000000..15ad9a8 --- /dev/null +++ b/src/mapping/json/index.ts @@ -0,0 +1,3 @@ +export * from './asset'; +export * from './figuremap'; +export * from './furnidata'; diff --git a/src/mapping/mappers/asset/AssetMapper.ts b/src/mapping/mappers/asset/AssetMapper.ts new file mode 100644 index 0000000..9cebd0a --- /dev/null +++ b/src/mapping/mappers/asset/AssetMapper.ts @@ -0,0 +1,102 @@ +import { BundleProvider } from '../../../common/bundle/BundleProvider'; +import { IAsset, IAssetData, IAssetPalette } from '../../json'; +import { AssetsXML, AssetXML, PaletteXML } from '../../xml'; +import { Mapper } from './Mapper'; + +export class AssetMapper extends Mapper +{ + public static mapXML(assets: any, output: IAssetData): void + { + if(!assets || !output) return; + + AssetMapper.mapAssetsXML(new AssetsXML(assets), output); + } + + private static mapAssetsXML(xml: AssetsXML, output: IAssetData): void + { + if(!xml) return; + + if(xml.assets !== undefined) + { + output.assets = {}; + + AssetMapper.mapAssetsAssetXML(xml.assets, output.assets); + } + + if(xml.palettes !== undefined) + { + output.palettes = {}; + + AssetMapper.mapAssetsPaletteXML(xml.palettes, output.palettes); + } + } + + private static mapAssetsAssetXML(xml: AssetXML[], output: { [index: string]: IAsset }): void + { + if(!xml || !xml.length) return; + + for(const assetXML of xml) + { + const asset: IAsset = {}; + + if(assetXML.name !== undefined) + { + let isProhibited = false; + + for(const size of AssetMapper.PROHIBITED_SIZES) + { + if(assetXML.name.indexOf(('_' + size + '_')) >= 0) + { + isProhibited = true; + + break; + } + } + + if(isProhibited) continue; + } + + if(assetXML.source !== undefined) + { + asset.source = assetXML.source; + + if(BundleProvider.imageSource.has(assetXML.source)) + { + asset.source = BundleProvider.imageSource.get(assetXML.source) as string; + } + } + + if(assetXML.name !== undefined) + { + if(BundleProvider.imageSource.has(assetXML.name)) + { + asset.source = BundleProvider.imageSource.get(assetXML.name) as string; + } + } + + if(assetXML.x !== undefined) asset.x = assetXML.x; + if(assetXML.y !== undefined) asset.y = assetXML.y; + if(assetXML.flipH !== undefined) asset.flipH = assetXML.flipH; + if(assetXML.flipV !== undefined) asset.flipV = assetXML.flipV; + + output[assetXML.name] = asset; + } + } + + private static mapAssetsPaletteXML(xml: PaletteXML[], output: { [index: string]: IAssetPalette }): void + { + if(!xml || !xml.length) return; + + for(const paletteXML of xml) + { + const palette: IAssetPalette = {}; + + if(paletteXML.id !== undefined) palette.id = paletteXML.id; + if(paletteXML.source !== undefined) palette.source = paletteXML.source; + if(paletteXML.color1 !== undefined) palette.color1 = paletteXML.color1; + if(paletteXML.color2 !== undefined) palette.color2 = paletteXML.color2; + + output[paletteXML.id.toString()] = palette; + } + } +} diff --git a/src/mapping/mappers/asset/IndexMapper.ts b/src/mapping/mappers/asset/IndexMapper.ts new file mode 100644 index 0000000..e8714ff --- /dev/null +++ b/src/mapping/mappers/asset/IndexMapper.ts @@ -0,0 +1,22 @@ +import { IAssetData } from '../../json'; +import { IndexXML } from '../../xml'; +import { Mapper } from './Mapper'; + +export class IndexMapper extends Mapper +{ + public static mapXML(index: any, output: IAssetData): void + { + if(!index || !output) return; + + IndexMapper.mapIndexXML(new IndexXML(index.object), output); + } + + private static mapIndexXML(indexXML: IndexXML, output: IAssetData): void + { + if(!indexXML) return; + + if(indexXML.type !== undefined) output.name = indexXML.type; + if(indexXML.logic !== undefined) output.logicType = indexXML.logic; + if(indexXML.visualization !== undefined) output.visualizationType = indexXML.visualization; + } +} diff --git a/src/mapping/mappers/asset/LogicMapper.ts b/src/mapping/mappers/asset/LogicMapper.ts new file mode 100644 index 0000000..b0fffba --- /dev/null +++ b/src/mapping/mappers/asset/LogicMapper.ts @@ -0,0 +1,67 @@ +import { IAssetData } from '../../json'; +import { LogicXML } from '../../xml'; +import { Mapper } from './Mapper'; + +export class LogicMapper extends Mapper +{ + public static mapXML(logic: any, output: IAssetData): void + { + if(!logic || !output) return; + + LogicMapper.mapLogicXML(new LogicXML(logic.objectData), output); + } + + private static mapLogicXML(xml: LogicXML, output: IAssetData): void + { + if(!xml) return; + + if(xml.model !== undefined) + { + if(xml.model.dimensions !== undefined) + { + output.dimensions = { + x: xml.model.dimensions.x, + y: xml.model.dimensions.y, + z: xml.model.dimensions.z + }; + } + + if(xml.model.directions !== undefined) + { + const directions: number[] = []; + + if(!xml.model.directions.length) + { + directions.push(0); + } + else + { + for(const direction of xml.model.directions) directions.push(parseInt(direction.id.toString())); + } + + output.directions = directions; + } + } + + if(xml.action !== undefined) + { + if(xml.action.link !== undefined) + { + if(!output.action) output.action = {}; + + output.action.link = xml.action.link; + } + + if(xml.action.startState !== undefined) + { + if(!output.action) output.action = {}; + + output.action.startState = xml.action.startState; + } + } + + if(xml.mask !== undefined) output.maskType = xml.mask.type; + + if(xml.credits !== undefined) output.credits = xml.credits.value; + } +} diff --git a/src/mapping/mappers/asset/Mapper.ts b/src/mapping/mappers/asset/Mapper.ts new file mode 100644 index 0000000..b926e61 --- /dev/null +++ b/src/mapping/mappers/asset/Mapper.ts @@ -0,0 +1,4 @@ +export class Mapper +{ + public static PROHIBITED_SIZES: string[] = []; +} diff --git a/src/mapping/mappers/asset/VisualizationMapper.ts b/src/mapping/mappers/asset/VisualizationMapper.ts new file mode 100644 index 0000000..8e07e0e --- /dev/null +++ b/src/mapping/mappers/asset/VisualizationMapper.ts @@ -0,0 +1,359 @@ +import { IAssetAnimation, IAssetAnimationLayer, IAssetAnimationSequence, IAssetAnimationSequenceFrame, IAssetAnimationSequenceFrameOffset, IAssetColor, IAssetColorLayer, IAssetData, IAssetGesture, IAssetPosture, IAssetVisualizationData, IAssetVisualizationDirection, IAssetVisualizationLayer } from '../../json'; +import { AnimationLayerXML, AnimationXML, ColorLayerXML, ColorXML, FrameOffsetXML, FrameSequenceXML, FrameXML, GestureXML, LayerXML, PostureXML, VisualDirectionXML, VisualizationDataXML, VisualizationXML } from '../../xml'; +import { Mapper } from './Mapper'; + +export class VisualizationMapper extends Mapper +{ + public static mapXML(visualization: any, output: IAssetData): void + { + if(!visualization || !output) return; + + VisualizationMapper.mapVisualizationXML(new VisualizationXML(visualization.visualizationData), output); + } + + private static mapVisualizationXML(xml: VisualizationXML, output: IAssetData): void + { + if(!xml) return; + + if(xml.visualizations !== undefined) + { + output.visualizations = []; + + VisualizationMapper.mapVisualizationDataXML(xml.visualizations, output.visualizations); + } + } + + private static mapVisualizationDataXML(xml: VisualizationDataXML[], output: IAssetVisualizationData[]): void + { + if(!xml || !xml.length) return; + + for(const visualizationDataXML of xml) + { + if(visualizationDataXML.size !== undefined) + { + let isProhibited = false; + + for(const size of VisualizationMapper.PROHIBITED_SIZES) + { + if(visualizationDataXML.size === parseInt(size)) + { + isProhibited = true; + + break; + } + } + + if(isProhibited) continue; + } + + const visualizationData: IAssetVisualizationData = {}; + + if(visualizationDataXML.angle !== undefined) visualizationData.angle = visualizationDataXML.angle; + if(visualizationDataXML.layerCount !== undefined) visualizationData.layerCount = visualizationDataXML.layerCount; + if(visualizationDataXML.size !== undefined) visualizationData.size = visualizationDataXML.size; + + if(visualizationDataXML.layers !== undefined) + { + if(visualizationDataXML.layers.length) + { + visualizationData.layers = {}; + + VisualizationMapper.mapVisualizationLayerXML(visualizationDataXML.layers, visualizationData.layers); + } + } + + if(visualizationDataXML.directions !== undefined) + { + if(visualizationDataXML.directions.length) + { + visualizationData.directions = {}; + + VisualizationMapper.mapVisualizationDirectionXML(visualizationDataXML.directions, visualizationData.directions); + } + } + + if(visualizationDataXML.colors !== undefined) + { + if(visualizationDataXML.colors.length) + { + visualizationData.colors = {}; + + VisualizationMapper.mapVisualizationColorXML(visualizationDataXML.colors, visualizationData.colors); + } + } + + if(visualizationDataXML.animations !== undefined) + { + if(visualizationDataXML.animations.length) + { + visualizationData.animations = {}; + + VisualizationMapper.mapVisualizationAnimationXML(visualizationDataXML.animations, visualizationData.animations); + } + } + + if(visualizationDataXML.postures !== undefined) + { + if(visualizationDataXML.postures.length) + { + visualizationData.postures = {}; + + VisualizationMapper.mapVisualizationPostureXML(visualizationDataXML.postures, visualizationData.postures); + } + } + + if(visualizationDataXML.gestures !== undefined) + { + if(visualizationDataXML.gestures.length) + { + visualizationData.gestures = {}; + + VisualizationMapper.mapVisualizationGestureXML(visualizationDataXML.gestures, visualizationData.gestures); + } + } + + output.push(visualizationData); + } + } + + private static mapVisualizationLayerXML(xml: LayerXML[], output: { [index: string]: IAssetVisualizationLayer }): void + { + if(!xml || !xml.length) return; + + for(const layerXML of xml) + { + const layer: IAssetVisualizationLayer = {}; + + if(layerXML.x !== undefined) layer.x = layerXML.x; + if(layerXML.y !== undefined) layer.y = layerXML.y; + if(layerXML.z !== undefined) layer.z = layerXML.z; + if(layerXML.alpha !== undefined) layer.alpha = layerXML.alpha; + if(layerXML.ink !== undefined) layer.ink = layerXML.ink; + if(layerXML.tag !== undefined) layer.tag = layerXML.tag; + if(layerXML.ignoreMouse !== undefined) layer.ignoreMouse = layerXML.ignoreMouse; + + output[layerXML.id.toString()] = layer; + } + } + + private static mapVisualizationDirectionXML(xml: VisualDirectionXML[], output: { [index: string]: IAssetVisualizationDirection }): void + { + if(!xml || !xml.length) return; + + for(const directionXML of xml) + { + const direction: IAssetVisualizationDirection = {}; + + if(directionXML.layers !== undefined) + { + if(directionXML.layers.length) + { + direction.layers = {}; + + VisualizationMapper.mapVisualizationLayerXML(directionXML.layers, direction.layers); + } + } + + output[directionXML.id.toString()] = direction; + } + } + + private static mapVisualizationColorXML(xml: ColorXML[], output: { [index: string]: IAssetColor }): void + { + if(!xml || !xml.length) return; + + for(const colorXML of xml) + { + const color: IAssetColor = {}; + + if(colorXML.layers !== undefined) + { + if(colorXML.layers.length) + { + color.layers = {}; + + VisualizationMapper.mapVisualizationColorLayerXML(colorXML.layers, color.layers); + } + } + + output[colorXML.id.toString()] = color; + } + } + + private static mapVisualizationColorLayerXML(xml: ColorLayerXML[], output: { [index: string]: IAssetColorLayer }): void + { + if(!xml || !xml.length) return; + + for(const colorLayerXML of xml) + { + const colorLayer: IAssetColorLayer = {}; + + if(colorLayerXML.color !== undefined) colorLayer.color = parseInt(colorLayerXML.color, 16); + + output[colorLayerXML.id.toString()] = colorLayer; + } + } + + private static mapVisualizationAnimationXML(xml: AnimationXML[], output: { [index: string]: IAssetAnimation }): void + { + if(!xml || !xml.length) return; + + for(const animationXML of xml) + { + const animation: IAssetAnimation = {}; + + if(animationXML.transitionTo !== undefined) animation.transitionTo = animationXML.transitionTo; + if(animationXML.transitionFrom !== undefined) animation.transitionFrom = animationXML.transitionFrom; + if(animationXML.immediateChangeFrom !== undefined) animation.immediateChangeFrom = animationXML.immediateChangeFrom; + + if(animationXML.layers !== undefined) + { + if(animationXML.layers.length) + { + animation.layers = {}; + + VisualizationMapper.mapVisualizationAnimationLayerXML(animationXML.layers, animation.layers); + } + } + + output[animationXML.id.toString()] = animation; + } + } + + private static mapVisualizationAnimationLayerXML(xml: AnimationLayerXML[], output: { [index: string]: IAssetAnimationLayer }): void + { + if(!xml || !xml.length) return; + + for(const animationLayerXML of xml) + { + const animationLayer: IAssetAnimationLayer = {}; + + if(animationLayerXML.frameRepeat !== undefined) animationLayer.frameRepeat = animationLayerXML.frameRepeat; + if(animationLayerXML.loopCount !== undefined) animationLayer.loopCount = animationLayerXML.loopCount; + if(animationLayerXML.random !== undefined) animationLayer.random = animationLayerXML.random; + + if(animationLayerXML.frameSequences !== undefined) + { + if(animationLayerXML.frameSequences.length) + { + animationLayer.frameSequences = {}; + + VisualizationMapper.mapVisualizationFrameSequenceXML(animationLayerXML.frameSequences, animationLayer.frameSequences); + } + } + + output[animationLayerXML.id.toString()] = animationLayer; + } + } + + private static mapVisualizationFrameSequenceXML(xml: FrameSequenceXML[], output: { [index: string]: IAssetAnimationSequence }): void + { + if(!xml || !xml.length) return; + + let i = 0; + + for(const frameSequenceXML of xml) + { + const frameSequence: IAssetAnimationSequence = {}; + + if(frameSequenceXML.loopCount !== undefined) frameSequence.loopCount = frameSequenceXML.loopCount; + if(frameSequenceXML.random !== undefined) frameSequence.random = frameSequenceXML.random; + + if(frameSequenceXML.frames !== undefined) + { + if(frameSequenceXML.frames.length) + { + frameSequence.frames = {}; + + VisualizationMapper.mapVisualizationFrameSequenceFrameXML(frameSequenceXML.frames, frameSequence.frames); + } + } + + output[i.toString()] = frameSequence; + + i++; + } + } + + private static mapVisualizationFrameSequenceFrameXML(xml: FrameXML[], output: { [index: string]: IAssetAnimationSequenceFrame }): void + { + if(!xml || !xml.length) return; + + let i = 0; + + for(const frameXML of xml) + { + const frame: IAssetAnimationSequenceFrame = {}; + + if((frameXML.id === undefined) || (frameXML.id === 'NaN')) frame.id = 0; + else frame.id = parseInt(frameXML.id); + + if(frameXML.x !== undefined) frame.x = frameXML.x; + if(frameXML.y !== undefined) frame.y = frameXML.y; + if(frameXML.randomX !== undefined) frame.randomX = frameXML.randomX; + if(frameXML.randomY !== undefined) frame.randomY = frameXML.randomY; + + if(frameXML.offsets !== undefined) + { + if(frameXML.offsets.length) + { + frame.offsets = {}; + + VisualizationMapper.mapVisualizationFrameSequenceFrameOffsetXML(frameXML.offsets, frame.offsets); + } + } + + output[i.toString()] = frame; + + i++; + } + } + + private static mapVisualizationFrameSequenceFrameOffsetXML(xml: FrameOffsetXML[], output: { [index: string]: IAssetAnimationSequenceFrameOffset }): void + { + if(!xml || !xml.length) return; + + let i = 0; + + for(const offsetXML of xml) + { + const offset: IAssetAnimationSequenceFrameOffset = {}; + + if(offsetXML.direction !== undefined) offset.direction = offsetXML.direction; + if(offsetXML.x !== undefined) offset.x = offsetXML.x; + if(offsetXML.y !== undefined) offset.y = offsetXML.y; + + output[i.toString()] = offset; + } + } + + private static mapVisualizationPostureXML(xml: PostureXML[], output: { [index: string]: IAssetPosture }): void + { + if(!xml || !xml.length) return; + + for(const postureXML of xml) + { + const posture: IAssetPosture = {}; + + if(postureXML.id !== undefined) posture.id = postureXML.id; + if(postureXML.animationId !== undefined) posture.animationId = postureXML.animationId; + + output[postureXML.id] = posture; + } + } + + private static mapVisualizationGestureXML(xml: GestureXML[], output: { [index: string]: IAssetGesture }): void + { + if(!xml || !xml.length) return; + + for(const gestureXML of xml) + { + const gesture: IAssetGesture = {}; + + if(gestureXML.id !== undefined) gesture.id = gestureXML.id; + if(gestureXML.animationId !== undefined) gesture.animationId = gestureXML.animationId; + + output[gestureXML.id] = gesture; + } + } +} diff --git a/src/mapping/mappers/asset/index.ts b/src/mapping/mappers/asset/index.ts new file mode 100644 index 0000000..51ff329 --- /dev/null +++ b/src/mapping/mappers/asset/index.ts @@ -0,0 +1,4 @@ +export * from './AssetMapper'; +export * from './IndexMapper'; +export * from './LogicMapper'; +export * from './VisualizationMapper'; diff --git a/src/mapping/mappers/index.ts b/src/mapping/mappers/index.ts new file mode 100644 index 0000000..ea2719d --- /dev/null +++ b/src/mapping/mappers/index.ts @@ -0,0 +1 @@ +export * from './asset'; diff --git a/src/mapping/xml/asset/IndexXML.ts b/src/mapping/xml/asset/IndexXML.ts new file mode 100644 index 0000000..abb9468 --- /dev/null +++ b/src/mapping/xml/asset/IndexXML.ts @@ -0,0 +1,33 @@ +export class IndexXML +{ + private readonly _type: string; + private readonly _visualization: string; + private readonly _logic: string; + + constructor(xml: any) + { + const attributes = xml.$; + + if(attributes !== undefined) + { + if(attributes.type !== undefined) this._type = attributes.type; + if(attributes.visualization !== undefined) this._visualization = attributes.visualization; + if(attributes.logic !== undefined) this._logic = attributes.logic; + } + } + + public get type(): string + { + return this._type; + } + + public get visualization(): string + { + return this._visualization; + } + + public get logic(): string + { + return this._logic; + } +} diff --git a/src/mapping/xml/asset/assets/AssetXML.ts b/src/mapping/xml/asset/assets/AssetXML.ts new file mode 100644 index 0000000..2a3e6b7 --- /dev/null +++ b/src/mapping/xml/asset/assets/AssetXML.ts @@ -0,0 +1,61 @@ +export class AssetXML +{ + private readonly _name: string; + private readonly _source: string; + private readonly _x: number; + private readonly _y: number; + private readonly _flipH: boolean; + private readonly _flipV: boolean; + private readonly _usesPalette: number; + + constructor(asset: any) + { + const attributes = asset.$; + + if(attributes !== undefined) + { + if(attributes.name !== undefined) this._name = attributes.name; + if(attributes.source !== undefined) this._source = attributes.source; + if(attributes.x !== undefined) this._x = parseInt(attributes.x); + if(attributes.x !== undefined) this._y = parseInt(attributes.y); + if(attributes.flipH !== undefined) this._flipH = (attributes.flipH === '1'); + if(attributes.flipV !== undefined) this._flipV = (attributes.flipV === '1'); + if(attributes.usesPalette !== undefined) this._usesPalette = parseInt(attributes.usesPalette); + } + } + + public get name(): string + { + return this._name; + } + + public get source(): string + { + return this._source; + } + + public get x(): number + { + return this._x; + } + + public get y(): number + { + return this._y; + } + + public get flipH(): boolean + { + return this._flipH; + } + + public get flipV(): boolean + { + return this._flipV; + } + + public get usesPalette(): number + { + return this._usesPalette; + } +} diff --git a/src/mapping/xml/asset/assets/AssetsXML.ts b/src/mapping/xml/asset/assets/AssetsXML.ts new file mode 100644 index 0000000..b5831b5 --- /dev/null +++ b/src/mapping/xml/asset/assets/AssetsXML.ts @@ -0,0 +1,35 @@ +import { AssetXML } from './AssetXML'; +import { PaletteXML } from './PaletteXML'; + +export class AssetsXML +{ + private readonly _assets: AssetXML[]; + private readonly _palettes: PaletteXML[]; + + constructor(xml: any) + { + if(xml.assets !== undefined) + { + this._assets = []; + + if(xml.assets.asset !== undefined) for(const asset of xml.assets.asset) this._assets.push(new AssetXML(asset)); + + if(xml.assets.palette !== undefined) + { + this._palettes = []; + + for(const palette of xml.assets.palette) this._palettes.push(new PaletteXML(palette)); + } + } + } + + public get assets(): AssetXML[] + { + return this._assets; + } + + public get palettes(): PaletteXML[] + { + return this._palettes; + } +} diff --git a/src/mapping/xml/asset/assets/PaletteXML.ts b/src/mapping/xml/asset/assets/PaletteXML.ts new file mode 100644 index 0000000..7893a8a --- /dev/null +++ b/src/mapping/xml/asset/assets/PaletteXML.ts @@ -0,0 +1,40 @@ +export class PaletteXML +{ + private readonly _id: number; + private readonly _source: string; + private readonly _color1: string; + private readonly _color2: string; + + constructor(xml: any) + { + const attributes = xml.$; + + if(attributes) + { + if(attributes.id !== undefined) this._id = parseInt(attributes.id); + if(attributes.source !== undefined) this._source = attributes.source; + if(attributes.color1 !== undefined) this._color1 = attributes.color1; + if(attributes.color2 !== undefined) this._color2 = attributes.color2; + } + } + + public get id(): number + { + return this._id; + } + + public get source(): string + { + return this._source; + } + + public get color1(): string + { + return this._color1; + } + + public get color2(): string + { + return this._color2; + } +} diff --git a/src/mapping/xml/asset/assets/index.ts b/src/mapping/xml/asset/assets/index.ts new file mode 100644 index 0000000..433c955 --- /dev/null +++ b/src/mapping/xml/asset/assets/index.ts @@ -0,0 +1,3 @@ +export * from './AssetsXML'; +export * from './AssetXML'; +export * from './PaletteXML'; diff --git a/src/mapping/xml/asset/index.ts b/src/mapping/xml/asset/index.ts new file mode 100644 index 0000000..7b54e38 --- /dev/null +++ b/src/mapping/xml/asset/index.ts @@ -0,0 +1,5 @@ +export * from './assets'; +export * from './index'; +export * from './IndexXML'; +export * from './logic'; +export * from './visualization'; diff --git a/src/mapping/xml/asset/logic/ActionXML.ts b/src/mapping/xml/asset/logic/ActionXML.ts new file mode 100644 index 0000000..977feb6 --- /dev/null +++ b/src/mapping/xml/asset/logic/ActionXML.ts @@ -0,0 +1,26 @@ +export class ActionXML +{ + private readonly _link: string; + private readonly _startState: number; + + constructor(xml: any) + { + const attributes = xml.$; + + if(attributes !== undefined) + { + if(attributes.link !== undefined) this._link = attributes.link; + if(attributes.startState !== undefined) this._startState = parseInt(attributes.startState); + } + } + + public get link(): string + { + return this._link; + } + + public get startState(): number + { + return this._startState; + } +} diff --git a/src/mapping/xml/asset/logic/CreditsXML.ts b/src/mapping/xml/asset/logic/CreditsXML.ts new file mode 100644 index 0000000..be06673 --- /dev/null +++ b/src/mapping/xml/asset/logic/CreditsXML.ts @@ -0,0 +1,19 @@ +export class CreditsXML +{ + private readonly _value: string; + + constructor(xml: any) + { + const attributes = xml.$; + + if(attributes !== undefined) + { + if(attributes.value !== undefined) this._value = attributes.value; + } + } + + public get value(): string + { + return this._value; + } +} diff --git a/src/mapping/xml/asset/logic/LogicXML.ts b/src/mapping/xml/asset/logic/LogicXML.ts new file mode 100644 index 0000000..c3f6a3f --- /dev/null +++ b/src/mapping/xml/asset/logic/LogicXML.ts @@ -0,0 +1,68 @@ +import { ActionXML } from './ActionXML'; +import { CreditsXML } from './CreditsXML'; +import { MaskXML } from './MaskXML'; +import { ModelXML } from './model/ModelXML'; + +export class LogicXML +{ + private readonly _type: string; + private readonly _model: ModelXML; + private readonly _action: ActionXML; + private readonly _mask: MaskXML; + private readonly _credits: CreditsXML; + + constructor(xml: any) + { + const attributes = xml.$; + + if(attributes !== undefined) + { + if(attributes.type !== undefined) this._type = attributes.type; + } + + if(xml.model !== undefined) + { + if(xml.model[0] !== undefined) this._model = new ModelXML(xml.model[0]); + } + + if(xml.action !== undefined) + { + if(xml.action[0] !== undefined) this._action = new ActionXML(xml.action[0]); + } + + if(xml.mask !== undefined) + { + if(xml.mask[0] !== undefined) this._mask = new MaskXML(xml.mask[0]); + } + + if(xml.credits !== undefined) + { + if(xml.credits[0] !== undefined) this._credits = new CreditsXML(xml.credits[0]); + } + } + + public get type(): string + { + return this._type; + } + + public get model(): ModelXML + { + return this._model; + } + + public get action(): ActionXML | undefined + { + return this._action; + } + + public get mask(): MaskXML | undefined + { + return this._mask; + } + + public get credits(): CreditsXML | undefined + { + return this._credits; + } +} diff --git a/src/mapping/xml/asset/logic/MaskXML.ts b/src/mapping/xml/asset/logic/MaskXML.ts new file mode 100644 index 0000000..87afa8c --- /dev/null +++ b/src/mapping/xml/asset/logic/MaskXML.ts @@ -0,0 +1,19 @@ +export class MaskXML +{ + private readonly _type: string; + + constructor(xml: any) + { + const attributes = xml.$; + + if(attributes !== undefined) + { + if(attributes.type !== undefined) this._type = attributes.type; + } + } + + public get type(): string + { + return this._type; + } +} diff --git a/src/mapping/xml/asset/logic/index.ts b/src/mapping/xml/asset/logic/index.ts new file mode 100644 index 0000000..91228e4 --- /dev/null +++ b/src/mapping/xml/asset/logic/index.ts @@ -0,0 +1,5 @@ +export * from './ActionXML'; +export * from './CreditsXML'; +export * from './LogicXML'; +export * from './MaskXML'; +export * from './model'; diff --git a/src/mapping/xml/asset/logic/model/DimensionsXML.ts b/src/mapping/xml/asset/logic/model/DimensionsXML.ts new file mode 100644 index 0000000..fe01a82 --- /dev/null +++ b/src/mapping/xml/asset/logic/model/DimensionsXML.ts @@ -0,0 +1,33 @@ +export class DimensionsXML +{ + private readonly _x: number; + private readonly _y: number; + private readonly _z: number; + + constructor(xml: any) + { + const attributes = xml.$; + + if(attributes !== undefined) + { + if(attributes.x !== undefined) this._x = parseInt(attributes.x); + if(attributes.y !== undefined) this._y = parseInt(attributes.y); + if(attributes.z !== undefined) this._z = parseInt(attributes.z); + } + } + + public get x(): number + { + return this._x; + } + + public get y(): number + { + return this._y; + } + + public get z(): number + { + return this._z; + } +} diff --git a/src/mapping/xml/asset/logic/model/ModelDirectionXML.ts b/src/mapping/xml/asset/logic/model/ModelDirectionXML.ts new file mode 100644 index 0000000..7a9e917 --- /dev/null +++ b/src/mapping/xml/asset/logic/model/ModelDirectionXML.ts @@ -0,0 +1,14 @@ +export class ModelDirectionXML +{ + private readonly _id: number; + + constructor(xml: any) + { + if(xml.id !== undefined) this._id = parseInt(xml.id); + } + + public get id(): number + { + return this._id; + } +} diff --git a/src/mapping/xml/asset/logic/model/ModelXML.ts b/src/mapping/xml/asset/logic/model/ModelXML.ts new file mode 100644 index 0000000..26bff00 --- /dev/null +++ b/src/mapping/xml/asset/logic/model/ModelXML.ts @@ -0,0 +1,39 @@ +import { DimensionsXML } from './DimensionsXML'; +import { ModelDirectionXML } from './ModelDirectionXML'; + +export class ModelXML +{ + private readonly _dimensions: DimensionsXML; + private readonly _directions: ModelDirectionXML[]; + + constructor(xml: any) + { + if(xml.dimensions !== undefined) + { + if(xml.dimensions[0] !== undefined) this._dimensions = new DimensionsXML(xml.dimensions[0]); + } + + if(xml.directions !== undefined) + { + this._directions = []; + + if(Array.isArray(xml.directions)) + { + for(const directionParent of xml.directions) + { + if(Array.isArray(directionParent.direction)) for(const direction of directionParent.direction) this._directions.push(new ModelDirectionXML(direction.$)); + } + } + } + } + + public get dimensions(): DimensionsXML + { + return this._dimensions; + } + + public get directions(): ModelDirectionXML[] + { + return this._directions; + } +} diff --git a/src/mapping/xml/asset/logic/model/index.ts b/src/mapping/xml/asset/logic/model/index.ts new file mode 100644 index 0000000..7de88b2 --- /dev/null +++ b/src/mapping/xml/asset/logic/model/index.ts @@ -0,0 +1,2 @@ +export * from './DimensionsXML'; +export * from './ModelDirectionXML'; diff --git a/src/mapping/xml/asset/visualization/GestureXML.ts b/src/mapping/xml/asset/visualization/GestureXML.ts new file mode 100644 index 0000000..316fe90 --- /dev/null +++ b/src/mapping/xml/asset/visualization/GestureXML.ts @@ -0,0 +1,26 @@ +export class GestureXML +{ + private readonly _id: string; + private readonly _animationId: number; + + constructor(xml: any) + { + const attributes = xml.$; + + if(attributes !== undefined) + { + if(attributes.id !== undefined) this._id = attributes.id; + if(attributes.animationId !== undefined) this._animationId = parseInt(attributes.animationId); + } + } + + public get id(): string + { + return this._id; + } + + public get animationId(): number + { + return this._animationId; + } +} diff --git a/src/mapping/xml/asset/visualization/LayerXML.ts b/src/mapping/xml/asset/visualization/LayerXML.ts new file mode 100644 index 0000000..af32ae0 --- /dev/null +++ b/src/mapping/xml/asset/visualization/LayerXML.ts @@ -0,0 +1,69 @@ +export class LayerXML +{ + private readonly _id: number; + private readonly _alpha: number; + private readonly _x: number; + private readonly _y: number; + private readonly _z: number; + private readonly _ink: string; + private readonly _tag: string; + private readonly _ignoreMouse: boolean; + + constructor(xml: any) + { + const attributes = xml.$; + + if(attributes !== undefined) + { + if(attributes.id !== undefined) this._id = parseInt(attributes.id); + if(attributes.alpha !== undefined) this._alpha = parseInt(attributes.alpha); + if(attributes.x !== undefined) this._x = parseInt(attributes.x); + if(attributes.y !== undefined) this._y = parseInt(attributes.y); + if(attributes.z !== undefined) this._z = parseInt(attributes.z); + if(attributes.ink !== undefined) this._ink = attributes.ink; + if(attributes.tag !== undefined) this._tag = attributes.tag; + + if(attributes.ignoreMouse !== undefined) this._ignoreMouse = (attributes.ignoreMouse === '1'); + } + } + + public get id(): number + { + return this._id; + } + + public get alpha(): number + { + return this._alpha; + } + + public get x(): number + { + return this._x; + } + + public get y(): number + { + return this._y; + } + + public get z(): number + { + return this._z; + } + + public get ink(): string + { + return this._ink; + } + + public get tag(): string + { + return this._tag; + } + + public get ignoreMouse(): boolean + { + return this._ignoreMouse; + } +} diff --git a/src/mapping/xml/asset/visualization/PostureXML.ts b/src/mapping/xml/asset/visualization/PostureXML.ts new file mode 100644 index 0000000..6a59e40 --- /dev/null +++ b/src/mapping/xml/asset/visualization/PostureXML.ts @@ -0,0 +1,26 @@ +export class PostureXML +{ + private readonly _id: string; + private readonly _animationId: number; + + constructor(xml: any) + { + const attributes = xml.$; + + if(attributes !== undefined) + { + if(attributes.id !== undefined) this._id = attributes.id; + if(attributes.animationId !== undefined) this._animationId = parseInt(attributes.animationId); + } + } + + public get id(): string + { + return this._id; + } + + public get animationId(): number + { + return this._animationId; + } +} diff --git a/src/mapping/xml/asset/visualization/VisualDirectionXML.ts b/src/mapping/xml/asset/visualization/VisualDirectionXML.ts new file mode 100644 index 0000000..974009d --- /dev/null +++ b/src/mapping/xml/asset/visualization/VisualDirectionXML.ts @@ -0,0 +1,34 @@ +import { LayerXML } from './LayerXML'; + +export class VisualDirectionXML +{ + private readonly _id: number; + private readonly _layers: LayerXML[]; + + constructor(xml: any) + { + const attributes = xml.$; + + if(attributes !== undefined) + { + if(attributes.id !== undefined) this._id = parseInt(attributes.id); + } + + if(xml.layer !== undefined) + { + this._layers = []; + + for(const layer of xml.layer) this._layers.push(new LayerXML(layer)); + } + } + + public get id(): number + { + return this._id; + } + + public get layers(): LayerXML[] + { + return this._layers; + } +} diff --git a/src/mapping/xml/asset/visualization/VisualizationDataXML.ts b/src/mapping/xml/asset/visualization/VisualizationDataXML.ts new file mode 100644 index 0000000..2948d48 --- /dev/null +++ b/src/mapping/xml/asset/visualization/VisualizationDataXML.ts @@ -0,0 +1,155 @@ +import { AnimationXML } from './animation/AnimationXML'; +import { ColorXML } from './color/ColorXML'; +import { GestureXML } from './GestureXML'; +import { LayerXML } from './LayerXML'; +import { PostureXML } from './PostureXML'; +import { VisualDirectionXML } from './VisualDirectionXML'; + +export class VisualizationDataXML +{ + private readonly _size: number; + private readonly _layerCount: number; + private readonly _angle: number; + + private readonly _layers: LayerXML[] + private readonly _directions: VisualDirectionXML[]; + private readonly _colors: ColorXML[]; + private readonly _animations: AnimationXML[]; + private readonly _postures: PostureXML[]; + private readonly _gestures: GestureXML[]; + + constructor(xml: any) + { + const attributes = xml.$; + + if(attributes !== undefined) + { + if(attributes.size !== undefined) this._size = parseInt(attributes.size); + if(attributes.layerCount !== undefined) this._layerCount = parseInt(attributes.layerCount); + if(attributes.angle !== undefined) this._angle = parseInt(attributes.angle); + } + + if(xml.layers !== undefined) + { + this._layers = []; + + for(const layerParent of xml.layers) + { + if(Array.isArray(layerParent.layer)) + { + for(const layer of layerParent.layer) this._layers.push(new LayerXML(layer)); + } + } + } + + if(xml.directions !== undefined) + { + this._directions = []; + + for(const directionParent of xml.directions) + { + if(Array.isArray(directionParent.direction)) + { + for(const direction of directionParent.direction) this._directions.push(new VisualDirectionXML(direction)); + } + } + } + + if(xml.colors !== undefined) + { + this._colors = []; + + for(const colorParent of xml.colors) + { + if(Array.isArray(colorParent.color)) + { + for(const color of colorParent.color) this._colors.push(new ColorXML(color)); + } + } + } + + if(xml.animations !== undefined) + { + this._animations = []; + + for(const animationParent of xml.animations) + { + if(Array.isArray(animationParent.animation)) + { + for(const animation of animationParent.animation) this._animations.push(new AnimationXML(animation)); + } + } + } + + if((xml.postures !== undefined) && xml.postures.length) + { + this._postures = []; + + for(const postureParent of xml.postures) + { + if(Array.isArray(postureParent.posture)) + { + for(const posture of postureParent.posture) this._postures.push(new PostureXML(posture)); + } + } + } + + if(xml.gestures !== undefined) + { + this._gestures = []; + + for(const gestureParent of xml.gestures) + { + if(Array.isArray(gestureParent.gesture)) + { + for(const gesture of gestureParent.gesture) this._gestures.push(new GestureXML(gesture)); + } + } + } + } + + public get size(): number + { + return this._size; + } + + public get layerCount(): number + { + return this._layerCount; + } + + public get angle(): number + { + return this._angle; + } + + public get layers(): LayerXML[] + { + return this._layers; + } + + public get directions(): VisualDirectionXML[] + { + return this._directions; + } + + public get colors(): ColorXML[] + { + return this._colors; + } + + public get animations(): AnimationXML[] + { + return this._animations; + } + + public get postures(): PostureXML[] + { + return this._postures; + } + + public get gestures(): GestureXML[] + { + return this._gestures; + } +} diff --git a/src/mapping/xml/asset/visualization/VisualizationXML.ts b/src/mapping/xml/asset/visualization/VisualizationXML.ts new file mode 100644 index 0000000..e5b8d57 --- /dev/null +++ b/src/mapping/xml/asset/visualization/VisualizationXML.ts @@ -0,0 +1,37 @@ +import { VisualizationDataXML } from './VisualizationDataXML'; + +export class VisualizationXML +{ + private readonly _type: string; + private readonly _visualizations: VisualizationDataXML[]; + + constructor(xml: any) + { + const attributes = xml.$; + + if(attributes !== undefined) + { + if(attributes.type !== undefined) this._type = attributes.type; + } + + if(xml.graphics !== undefined) + { + this._visualizations = []; + + if(Array.isArray(xml.graphics)) + { + for(const graphic of xml.graphics) for(const visualization of graphic.visualization) this._visualizations.push(new VisualizationDataXML(visualization)); + } + } + } + + public get type(): string + { + return this._type; + } + + public get visualizations(): VisualizationDataXML[] + { + return this._visualizations; + } +} diff --git a/src/mapping/xml/asset/visualization/animation/AnimationLayerXML.ts b/src/mapping/xml/asset/visualization/animation/AnimationLayerXML.ts new file mode 100644 index 0000000..1f8607a --- /dev/null +++ b/src/mapping/xml/asset/visualization/animation/AnimationLayerXML.ts @@ -0,0 +1,63 @@ +import { FrameSequenceXML } from './FrameSequenceXML'; + +export class AnimationLayerXML +{ + private readonly _id: number; + private readonly _loopCount: number; + private readonly _frameRepeat: number; + private readonly _random: number; + private readonly _randomStart: number; + + private readonly _frameSequences: FrameSequenceXML[]; + + constructor(xml: any) + { + const attributes = xml.$; + + if(attributes !== undefined) + { + if(attributes.id !== undefined) this._id = parseInt(attributes.id); + if(attributes.loopCount !== undefined) this._loopCount = parseInt(attributes.loopCount); + if(attributes.frameRepeat !== undefined) this._frameRepeat = parseInt(attributes.frameRepeat); + if(attributes.random !== undefined) this._random = parseInt(attributes.random); + if(attributes.randomStart !== undefined) this._randomStart = parseInt(attributes.randomStart); + } + + if(xml.frameSequence !== undefined) + { + this._frameSequences = []; + + for(const frameSequence of xml.frameSequence) this._frameSequences.push(new FrameSequenceXML(frameSequence)); + } + } + + public get id(): number + { + return this._id; + } + + public get loopCount(): number + { + return this._loopCount; + } + + public get frameRepeat(): number + { + return this._frameRepeat; + } + + public get random(): number + { + return this._random; + } + + public get randomStart(): number + { + return this._randomStart; + } + + public get frameSequences(): FrameSequenceXML[] + { + return this._frameSequences; + } +} diff --git a/src/mapping/xml/asset/visualization/animation/AnimationXML.ts b/src/mapping/xml/asset/visualization/animation/AnimationXML.ts new file mode 100644 index 0000000..c6fd5b4 --- /dev/null +++ b/src/mapping/xml/asset/visualization/animation/AnimationXML.ts @@ -0,0 +1,55 @@ +import { AnimationLayerXML } from './AnimationLayerXML'; + +export class AnimationXML +{ + private readonly _id: number; + private readonly _transitionTo: number; + private readonly _transitionFrom: number; + private readonly _immediateChangeFrom: string; + private readonly _layers: AnimationLayerXML[]; + + constructor(xml: any) + { + const attributes = xml.$; + + if(attributes !== undefined) + { + if(attributes.id !== undefined) this._id = parseInt(attributes.id); + if(attributes.transitionTo !== undefined) this._transitionTo = parseInt(attributes.transitionTo); + if(attributes.transitionFrom !== undefined) this._transitionFrom = parseInt(attributes.transitionFrom); + if(attributes.immediateChangeFrom !== undefined) this._immediateChangeFrom = attributes.immediateChangeFrom; + } + + if(xml.animationLayer !== undefined) + { + this._layers = []; + + for(const animationLayer of xml.animationLayer) this._layers.push(new AnimationLayerXML(animationLayer)); + } + } + + public get id(): number + { + return this._id; + } + + public get transitionTo(): number + { + return this._transitionTo; + } + + public get transitionFrom(): number + { + return this._transitionFrom; + } + + public get immediateChangeFrom(): string + { + return this._immediateChangeFrom; + } + + public get layers(): AnimationLayerXML[] + { + return this._layers; + } +} diff --git a/src/mapping/xml/asset/visualization/animation/FrameOffsetXML.ts b/src/mapping/xml/asset/visualization/animation/FrameOffsetXML.ts new file mode 100644 index 0000000..39919f8 --- /dev/null +++ b/src/mapping/xml/asset/visualization/animation/FrameOffsetXML.ts @@ -0,0 +1,33 @@ +export class FrameOffsetXML +{ + private readonly _direction: number; + private readonly _x: number; + private readonly _y: number; + + constructor(xml: any) + { + const attributes = xml.$; + + if(attributes !== undefined) + { + if(attributes.direction !== undefined) this._direction = parseInt(attributes.direction); + if(attributes.x !== undefined) this._x = parseInt(attributes.x); + if(attributes.y !== undefined) this._y = parseInt(attributes.y); + } + } + + public get direction(): number + { + return this._direction; + } + + public get x(): number + { + return this._x; + } + + public get y(): number + { + return this._y; + } +} diff --git a/src/mapping/xml/asset/visualization/animation/FrameSequenceXML.ts b/src/mapping/xml/asset/visualization/animation/FrameSequenceXML.ts new file mode 100644 index 0000000..52abe03 --- /dev/null +++ b/src/mapping/xml/asset/visualization/animation/FrameSequenceXML.ts @@ -0,0 +1,42 @@ +import { FrameXML } from './FrameXML'; + +export class FrameSequenceXML +{ + private readonly _loopCount: number; + private readonly _random: number; + + private readonly _frames: FrameXML[]; + + constructor(xml: any) + { + const attributes = xml.$; + + if(attributes !== undefined) + { + if(attributes.loopCount !== undefined) this._loopCount = parseInt(attributes.loopCount); + if(attributes.random !== undefined) this._random = parseInt(attributes.random); + } + + if(xml.frame !== undefined) + { + this._frames = []; + + for(const frame of xml.frame) this._frames.push(new FrameXML(frame)); + } + } + + public get loopCount(): number + { + return this._loopCount; + } + + public get random(): number + { + return this._random; + } + + public get frames(): FrameXML[] + { + return this._frames; + } +} diff --git a/src/mapping/xml/asset/visualization/animation/FrameXML.ts b/src/mapping/xml/asset/visualization/animation/FrameXML.ts new file mode 100644 index 0000000..e4fd747 --- /dev/null +++ b/src/mapping/xml/asset/visualization/animation/FrameXML.ts @@ -0,0 +1,63 @@ +import { FrameOffsetXML } from './FrameOffsetXML'; + +export class FrameXML +{ + private readonly _id: string; + private readonly _x: number; + private readonly _y: number; + private readonly _randomX: number; + private readonly _randomY: number; + + private readonly _offsets: FrameOffsetXML[]; + + constructor(xml: any) + { + const attributes = xml.$; + + if(attributes !== undefined) + { + if(attributes.id !== undefined) this._id = attributes.id; + if(attributes.x !== undefined) this._x = parseInt(attributes.x); + if(attributes.y !== undefined) this._y = parseInt(attributes.y); + if(attributes.randomX !== undefined) this._randomX = parseInt(attributes.randomX); + if(attributes.randomY !== undefined) this._randomY = parseInt(attributes.randomY); + } + + if(xml.offsets !== undefined) + { + this._offsets = []; + + for(const offsetParent of xml.offsets) for(const offset of offsetParent.offset) this._offsets.push(new FrameOffsetXML(offset)); + } + } + + public get id(): string + { + return this._id; + } + + public get x(): number + { + return this._x; + } + + public get y(): number + { + return this._y; + } + + public get randomX(): number + { + return this._randomX; + } + + public get randomY(): number + { + return this._randomY; + } + + public get offsets(): FrameOffsetXML[] + { + return this._offsets; + } +} diff --git a/src/mapping/xml/asset/visualization/animation/index.ts b/src/mapping/xml/asset/visualization/animation/index.ts new file mode 100644 index 0000000..f2b3dec --- /dev/null +++ b/src/mapping/xml/asset/visualization/animation/index.ts @@ -0,0 +1,5 @@ +export * from './AnimationLayerXML'; +export * from './AnimationXML'; +export * from './FrameOffsetXML'; +export * from './FrameSequenceXML'; +export * from './FrameXML'; diff --git a/src/mapping/xml/asset/visualization/color/ColorLayerXML.ts b/src/mapping/xml/asset/visualization/color/ColorLayerXML.ts new file mode 100644 index 0000000..8a02e63 --- /dev/null +++ b/src/mapping/xml/asset/visualization/color/ColorLayerXML.ts @@ -0,0 +1,26 @@ +export class ColorLayerXML +{ + private readonly _id: number; + private readonly _color: string; + + constructor(xml: any) + { + const attributes = xml.$; + + if(attributes !== undefined) + { + if(attributes.id !== undefined) this._id = parseInt(attributes.id); + if(attributes.color !== undefined) this._color = attributes.color; + } + } + + public get id(): number + { + return this._id; + } + + public get color(): string + { + return this._color; + } +} diff --git a/src/mapping/xml/asset/visualization/color/ColorXML.ts b/src/mapping/xml/asset/visualization/color/ColorXML.ts new file mode 100644 index 0000000..2c683b7 --- /dev/null +++ b/src/mapping/xml/asset/visualization/color/ColorXML.ts @@ -0,0 +1,34 @@ +import { ColorLayerXML } from './ColorLayerXML'; + +export class ColorXML +{ + private readonly _id: number; + private readonly _layers: ColorLayerXML[]; + + constructor(xml: any) + { + const attributes = xml.$; + + if(attributes !== undefined) + { + if(attributes.id !== undefined) this._id = parseInt(attributes.id); + } + + if(xml.colorLayer !== undefined) + { + this._layers = []; + + for(const colorLayer of xml.colorLayer) this._layers.push(new ColorLayerXML(colorLayer)); + } + } + + public get id(): number + { + return this._id; + } + + public get layers(): ColorLayerXML[] + { + return this._layers; + } +} diff --git a/src/mapping/xml/asset/visualization/color/index.ts b/src/mapping/xml/asset/visualization/color/index.ts new file mode 100644 index 0000000..624e093 --- /dev/null +++ b/src/mapping/xml/asset/visualization/color/index.ts @@ -0,0 +1,2 @@ +export * from './ColorLayerXML'; +export * from './ColorXML'; diff --git a/src/mapping/xml/asset/visualization/index.ts b/src/mapping/xml/asset/visualization/index.ts new file mode 100644 index 0000000..09de7d2 --- /dev/null +++ b/src/mapping/xml/asset/visualization/index.ts @@ -0,0 +1,8 @@ +export * from './animation'; +export * from './color'; +export * from './GestureXML'; +export * from './LayerXML'; +export * from './PostureXML'; +export * from './VisualDirectionXML'; +export * from './VisualizationDataXML'; +export * from './VisualizationXML'; diff --git a/src/mapping/xml/figuremap/FigureLibraryPartXML.ts b/src/mapping/xml/figuremap/FigureLibraryPartXML.ts new file mode 100644 index 0000000..964ae29 --- /dev/null +++ b/src/mapping/xml/figuremap/FigureLibraryPartXML.ts @@ -0,0 +1,26 @@ +export class FigureLibraryPartXML +{ + private _id: number; + private _type: string; + + constructor(xml: any) + { + const attributes = xml.$; + + if(attributes) + { + if(attributes.id !== undefined) this._id = parseInt(attributes.id); + if(attributes.type !== undefined) this._type = attributes.type; + } + } + + public get id(): number + { + return this._id; + } + + public get type(): string + { + return this._type; + } +} diff --git a/src/mapping/xml/figuremap/FigureLibraryXML.ts b/src/mapping/xml/figuremap/FigureLibraryXML.ts new file mode 100644 index 0000000..5b7b66a --- /dev/null +++ b/src/mapping/xml/figuremap/FigureLibraryXML.ts @@ -0,0 +1,46 @@ +import { FigureLibraryPartXML } from './FigureLibraryPartXML'; + +export class FigureLibraryXML +{ + private _id: string; + private _revision: number; + private _parts: FigureLibraryPartXML[]; + + constructor(xml: any) + { + const attributes = xml.$; + + if(attributes) + { + if(attributes.id !== undefined) this._id = attributes.id; + if(attributes.revision !== undefined) this._revision = parseInt(attributes.revision); + } + + if(xml.part !== undefined) + { + this._parts = []; + + for(const partId in xml.part) + { + const part = xml.part[partId]; + + this._parts.push(new FigureLibraryPartXML(part)); + } + } + } + + public get id(): string + { + return this._id; + } + + public get revision(): number + { + return this._revision; + } + + public get parts(): FigureLibraryPartXML[] + { + return this._parts; + } +} diff --git a/src/mapping/xml/figuremap/FigureMapXML.ts b/src/mapping/xml/figuremap/FigureMapXML.ts new file mode 100644 index 0000000..e475e88 --- /dev/null +++ b/src/mapping/xml/figuremap/FigureMapXML.ts @@ -0,0 +1,29 @@ +import { FigureLibraryXML } from './FigureLibraryXML'; + +export class FigureMapXML +{ + private _librares: FigureLibraryXML[]; + + constructor(xml: any) + { + if(xml.map !== undefined) + { + if(xml.map.lib !== undefined) + { + this._librares = []; + + for(const lib in xml.map.lib) + { + const library = xml.map.lib[lib]; + + this._librares.push(new FigureLibraryXML(library)); + } + } + } + } + + public get libraries(): FigureLibraryXML[] + { + return this._librares; + } +} diff --git a/src/mapping/xml/figuremap/index.ts b/src/mapping/xml/figuremap/index.ts new file mode 100644 index 0000000..c2a6b01 --- /dev/null +++ b/src/mapping/xml/figuremap/index.ts @@ -0,0 +1,3 @@ +export * from './FigureLibraryPartXML'; +export * from './FigureLibraryXML'; +export * from './FigureMapXML'; diff --git a/src/mapping/xml/furnidata/FurnitureDataXML.ts b/src/mapping/xml/furnidata/FurnitureDataXML.ts new file mode 100644 index 0000000..8bb8cc7 --- /dev/null +++ b/src/mapping/xml/furnidata/FurnitureDataXML.ts @@ -0,0 +1,52 @@ +import { FurnitureTypeXML } from './FurnitureTypeXML'; + +export class FurnitureDataXML +{ + private _floorItems: FurnitureTypeXML[]; + private _wallItems: FurnitureTypeXML[]; + + constructor(xml: any) + { + if(!xml) return; + + if(xml.roomitemtypes !== undefined) + { + this._floorItems = []; + + for(const roomitemtype in xml.roomitemtypes) + { + const furniTypes = xml.roomitemtypes[roomitemtype]; + + if(furniTypes !== undefined) + { + for(const furniType in furniTypes) this._floorItems.push(new FurnitureTypeXML('floor', furniType)); + } + } + } + + if(xml.wallitemtypes !== undefined) + { + this._wallItems = []; + + for(const wallitemtype in xml.wallitemtypes) + { + const furniTypes = xml.wallitemtypes[wallitemtype]; + + if(furniTypes !== undefined) + { + for(const furniType in furniTypes) this._wallItems.push(new FurnitureTypeXML('wall', furniType)); + } + } + } + } + + public get floorItems(): FurnitureTypeXML[] + { + return this._floorItems; + } + + public get wallItems(): FurnitureTypeXML[] + { + return this._wallItems; + } +} diff --git a/src/mapping/xml/furnidata/FurnitureTypeXML.ts b/src/mapping/xml/furnidata/FurnitureTypeXML.ts new file mode 100644 index 0000000..45bd3b3 --- /dev/null +++ b/src/mapping/xml/furnidata/FurnitureTypeXML.ts @@ -0,0 +1,96 @@ +export class FurnitureTypeXML +{ + public furniType: string; + + public id: number; + public classname: string; + public revision: number; + public category: string; + public defaultdir: number; + public xdim: number; + public ydim: number; + public partcolors: { color: string[] }; + public name: string; + public description: string; + public adurl: string; + public offerid: number; + public buyout: boolean; + public rentofferid: number; + public rentbuyout: boolean; + public bc: boolean; + public excludeddynamic: boolean; + public customparams: string; + public specialtype: number; + public canstandon: boolean; + public cansiton: boolean; + public canlayon: boolean; + public furniline: string; + public environment: string; + public rare: boolean; + + constructor(type: string, xml: any) + { + this.furniType = type; + + const attributes = xml.$; + + this.id = ((attributes && parseInt(attributes.id)) || 0); + this.classname = ((attributes && attributes.classname) || ''); + this.revision = ((xml.revision && xml.revision[0] && parseInt(xml.revision[0])) || 0); + this.category = ((xml.category && xml.category[0]) || 'unknown'); + + if(this.furniType === 'floor') + { + this.defaultdir = ((xml.defaultdir && parseInt(xml.defaultdir[0])) || 0); + this.xdim = ((xml.xdim && parseInt(xml.xdim[0])) || 0); + this.ydim = ((xml.ydim && parseInt(xml.ydim[0])) || 0); + + const colors: string[] = []; + + if(xml.partcolors) + { + for(let key in xml.partcolors) + { + const colorData = xml.partcolors[key].color; + + if(colorData) + { + for(let color of colorData) + { + let code = color; + + if(code.charAt(0) !== '#') code = ('#' + code); + + colors.push(code); + } + } + } + } + + this.partcolors = { color: [ ...colors ] }; + } + + this.name = ((xml.name && xml.name[0]) || ''); + this.description = ((xml.description && xml.description[0]) || ''); + this.adurl = (xml.adurl && xml.adurl[0] || ''); + this.offerid = ((xml.offerid && parseInt(xml.offerid[0])) || 0); + this.buyout = ((xml.buyout && parseInt(xml.buyout[0]) === 1) || false); + this.rentofferid = ((xml.rentofferid && parseInt(xml.rentofferid[0])) || 0); + this.rentbuyout = ((xml.rentbuyout && parseInt(xml.rentbuyout[0]) === 1) || false); + this.bc = ((xml.bc && parseInt(xml.bc[0]) === 1) || false); + this.excludeddynamic = ((xml.excludeddynamic && parseInt(xml.excludeddynamic[0]) === 1) || false); + this.customparams = ((xml.customparams && xml.customparams[0]) || ''); + this.specialtype = ((xml.specialtype && parseInt(xml.specialtype[0])) || 0); + + if(this.furniType === 'floor') + { + this.canstandon = ((xml.canstandon && parseInt(xml.canstandon[0]) === 1) || false); + this.cansiton = ((xml.cansiton && parseInt(xml.cansiton[0]) === 1) || false); + this.canlayon = ((xml.canlayon && parseInt(xml.canlayon[0]) === 1) || false); + } + + this.furniline = ((xml.furniline && xml.furniline[0]) || ''); + this.environment = ((xml.environment && xml.environment[0]) || ''); + this.rare = ((xml.rare && parseInt(xml.rare[0]) === 1) || false); + } +} diff --git a/src/mapping/xml/furnidata/index.ts b/src/mapping/xml/furnidata/index.ts new file mode 100644 index 0000000..119e3f9 --- /dev/null +++ b/src/mapping/xml/furnidata/index.ts @@ -0,0 +1,2 @@ +export * from './FurnitureDataXML'; +export * from './FurnitureTypeXML'; diff --git a/src/mapping/xml/index.ts b/src/mapping/xml/index.ts new file mode 100644 index 0000000..ad223d2 --- /dev/null +++ b/src/mapping/xml/index.ts @@ -0,0 +1,2 @@ +export * from './asset'; +export * from './furnidata'; diff --git a/src/pet/PetConverter.ts b/src/pet/PetConverter.ts deleted file mode 100644 index a97167b..0000000 --- a/src/pet/PetConverter.ts +++ /dev/null @@ -1,128 +0,0 @@ -import HabboAssetSWF from "../swf/HabboAssetSWF"; -import BundleTypes from "../bundle/BundleTypes"; -import File from "../utils/File"; -import NitroBundle from "../utils/NitroBundle"; -import DefineBinaryDataTag from "../swf/tags/DefineBinaryDataTag"; -import PetJsonMapper from "./mapper/PetJsonMapper"; -import {PetJson} from "./mapper/PetTypes"; -import Configuration from "../config/Configuration"; -import BundleProvider from "../bundle/BundleProvider"; -import PetDownloader from "./PetDownloader"; -import {singleton} from "tsyringe"; - -const xml2js = require('xml2js'); -const parser = new xml2js.Parser(/* options */); - -const fs = require('fs').promises; - -@singleton() -export default class PetConverter { - - constructor( - private readonly _petDownloader: PetDownloader, - private readonly _petJsonMapper: PetJsonMapper, - private readonly _config: Configuration, - private readonly _bundleProvider: BundleProvider) { - } - - private static getBinaryData(habboAssetSWF: HabboAssetSWF, type: string, documentNameTwice: boolean) { - let binaryName: string = habboAssetSWF.getFullClassName(type, documentNameTwice); - let tag = habboAssetSWF.getBinaryTagByName(binaryName); - if (tag === null) { - binaryName = habboAssetSWF.getFullClassNameSnake(type, documentNameTwice, true); - tag = habboAssetSWF.getBinaryTagByName(binaryName); - } - - return tag; - } - - private static async getAssetsXML(habboAssetSWF: HabboAssetSWF): Promise { - const binaryData: DefineBinaryDataTag | null = PetConverter.getBinaryData(habboAssetSWF, "assets", true); - if (binaryData !== null) { - return await parser.parseStringPromise(binaryData.binaryData); - } - - return null; - } - - private static async getLogicXML(habboAssetSWF: HabboAssetSWF): Promise { - const binaryData: DefineBinaryDataTag | null = PetConverter.getBinaryData(habboAssetSWF, "logic", true); - if (binaryData !== null) { - return await parser.parseStringPromise(binaryData.binaryData); - } - - return null; - } - - private static async getIndexXML(habboAssetSWF: HabboAssetSWF): Promise { - const binaryData: DefineBinaryDataTag | null = PetConverter.getBinaryData(habboAssetSWF, "index", false); - if (binaryData !== null) { - return await parser.parseStringPromise(binaryData.binaryData); - } - - return null; - } - - private static async getVisualizationXML(habboAssetSWF: HabboAssetSWF): Promise { - const binaryData: DefineBinaryDataTag | null = PetConverter.getBinaryData(habboAssetSWF, "visualization", true); - if (binaryData !== null) { - return await parser.parseStringPromise(binaryData.binaryData); - } - - return null; - } - - private async convertXML2JSON(habboAssetSWF: HabboAssetSWF): Promise { - const assetXml = await PetConverter.getAssetsXML(habboAssetSWF); - const logicXml = await PetConverter.getLogicXML(habboAssetSWF); - const indexXml = await PetConverter.getIndexXML(habboAssetSWF); - const visualizationXml = await PetConverter.getVisualizationXML(habboAssetSWF); - - return this._petJsonMapper.mapXML(habboAssetSWF, assetXml, indexXml, logicXml, visualizationXml); - } - - private async fromHabboAsset(habboAssetSWF: HabboAssetSWF, outputFolder: string, type: string, archiveType: BundleTypes) { - const petJson = await this.convertXML2JSON(habboAssetSWF); - if (petJson !== null) { - petJson.spritesheet = archiveType.spriteSheetType; - petJson.type = type; - - const path = outputFolder + "/" + habboAssetSWF.getDocumentClass() + ".nitro"; - const assetOutputFolder = new File(path); - if (assetOutputFolder.exists()) { - console.log("Pet already exists or the directory is not empty!"); - - return; - } - - const nitroBundle = new NitroBundle(); - nitroBundle.addFile(habboAssetSWF.getDocumentClass() + ".json", Buffer.from(JSON.stringify(petJson))); - nitroBundle.addFile(archiveType.imageData.name, archiveType.imageData.buffer); - - const buffer = await nitroBundle.toBufferAsync(); - await fs.writeFile(path, buffer); - } - } - - public async convertAsync() { - const outputFolderPet = new File(this._config.getValue("output.folder.pet")); - if (!outputFolderPet.isDirectory()) { - outputFolderPet.mkdirs(); - } - - const petConverter = this; - await this._petDownloader.download(async function (habboAssetSwf: HabboAssetSWF) { - console.log("Attempt parsing pet: " + habboAssetSwf.getDocumentClass()); - - try { - const spriteSheetType = await petConverter._bundleProvider.generateSpriteSheet(habboAssetSwf, outputFolderPet.path, "pet"); - if (spriteSheetType !== null) { - await petConverter.fromHabboAsset(habboAssetSwf, outputFolderPet.path, "pet", spriteSheetType); - } - } catch (e) { - console.log(e); - console.log("Pet error: " + habboAssetSwf.getDocumentClass()); - } - }); - } -} \ No newline at end of file diff --git a/src/pet/PetDownloader.ts b/src/pet/PetDownloader.ts deleted file mode 100644 index f5fa6ec..0000000 --- a/src/pet/PetDownloader.ts +++ /dev/null @@ -1,67 +0,0 @@ -import Configuration from "../config/Configuration"; -import HabboAssetSWF from "../swf/HabboAssetSWF"; -import File from "../utils/File"; -import {singleton} from "tsyringe"; -import Logger from "../utils/Logger"; - -const fetch = require('node-fetch'); - -@singleton() -export default class PetDownloader { - constructor( - private readonly _config: Configuration, - private readonly _logger: Logger) { - } - - public async download(callback: (habboAssetSwf: HabboAssetSWF) => Promise) { - const outputFolderPet = new File(this._config.getValue("output.folder.pet")); - await this._config.loadExternalVariables(); - - const pets = this._config.getValue("pet.configuration"); - if (pets !== "") { - const itemClassNames: Array = new Array(); - const petNames: string[] = pets.split(","); - - for (const pet of petNames) { - const petOutputFolder = new File(outputFolderPet.path + "/" + pet); - if (petOutputFolder.isDirectory()) { - continue; - } - - if (!itemClassNames.includes(pet)) { - const url = this._config.getValue("dynamic.download.url.pet").replace("%className%", pet); - let buffer: Buffer | null = null; - - if (url.includes("http")) { - const fetchData = await fetch(url); - if (fetchData.status === 404) { - console.log("SWF File does not exist: " + url); - continue; - } - - const arrayBuffer = await fetchData.arrayBuffer(); - buffer = Buffer.from(arrayBuffer); - console.log(buffer.toString('utf-8')); - } else { - const file = new File(url); - if (!file.exists()) { - console.log("SWF File does not exist: " + file.path); - return; - } - } - - try { - const newHabboAssetSWF: HabboAssetSWF = new HabboAssetSWF(buffer !== null ? buffer : url); - await newHabboAssetSWF.setupAsync(); - - await callback(newHabboAssetSWF); - } catch (e) { - await this._logger.logErrorAsync(`[${pet}]` + e); - } - } - - itemClassNames.push(pet); - } - } - } -} \ No newline at end of file diff --git a/src/pet/mapper/PetJsonMapper.ts b/src/pet/mapper/PetJsonMapper.ts deleted file mode 100644 index 18a5de7..0000000 --- a/src/pet/mapper/PetJsonMapper.ts +++ /dev/null @@ -1,416 +0,0 @@ -import { - Action, Animation, AnimationLayer, AnimationLayers, Animations, Color, ColorLayer, ColorLayers, Colors, - Direction, - Directions, Frame, Frames, FrameSequence, FrameSequences, Gesture, Gestures, - Layer, Offset, Palette, - PetAsset, - PetAssets, - PetJson, Posture, Postures, - Visualization, - VisualizationLayers -} from "./PetTypes"; -import {AssetsXML, IndexXML, LogicXML} from "./PetXMLTypes"; -import { - AnimationLayerXML, - AnimationXML, - ColorXML, - LayerXML, - VisualizationDataXML, - VisualizationXML -} from "./VisualizationXMLTypes"; -import HabboAssetSWF from "../../swf/HabboAssetSWF"; -import RGB from "./RGB"; -import BundleProvider from "../../bundle/BundleProvider"; -import {singleton} from "tsyringe"; - -const ByteBuffer = require('bytebuffer'); - -@singleton() -export default class PetJsonMapper { - - - private static readonly VISUALIZATION_DEFAULT_SIZE = 64; - - private static readonly VISUALIZATION_ICON_SIZE = 1; - - public mapXML(habboAssetSWF: HabboAssetSWF, assets: any, indexXML: any, logic: any, visualization: any): PetJson { - const petJson: PetJson = {} as any; - - this.mapAssetsXML(habboAssetSWF, new AssetsXML(assets), petJson); - PetJsonMapper.mapIndexXML(new IndexXML(indexXML.object), petJson); - PetJsonMapper.mapLogicXML(new LogicXML(logic.objectData), petJson); - PetJsonMapper.mapVisualizationXML(new VisualizationDataXML(visualization.visualizationData), petJson); - - return petJson; - } - - - private mapAssetsXML(habboAssetSWF: HabboAssetSWF, assetsXML: AssetsXML, output: PetJson) { - const assets: PetAssets = {} as any; - - for (const asset of assetsXML.assets) { - if (!asset.name.includes("_32_")) { - const petAsset: PetAsset = {} as any; - - if (asset.source !== undefined) { - petAsset.source = asset.source; - if (BundleProvider.imageSource.has(asset.source)) { - petAsset.source = BundleProvider.imageSource.get(asset.source) as string; - } - } - - if (BundleProvider.imageSource.has(asset.name)) { - petAsset.source = BundleProvider.imageSource.get(asset.name) as string; - } - - petAsset.x = parseInt(asset.x.toString()); - petAsset.y = parseInt(asset.y.toString()); - petAsset.flipH = asset.flipH as any; - petAsset.usesPalette = asset.usesPalette as any; - assets[asset.name] = petAsset; - } - } - - const palettes: Array = new Array(); - if (assetsXML.palettes.length > 0) { - for (const paletteXML of assetsXML.palettes) { - const palette: Palette = {} as any; - palette.id = parseInt(paletteXML.id.toString()); - palette.source = paletteXML.source; - palette.color1 = paletteXML.color1; - palette.color2 = paletteXML.color2; - - const paletteColors = this.getPalette(habboAssetSWF, paletteXML.source); - - const RGB: Array> = new Array>(); - if (paletteColors !== null) - for (const rgb of paletteColors) { - const rgbs: Array = new Array(); - rgbs.push(rgb.r); - rgbs.push(rgb.g); - rgbs.push(rgb.b); - RGB.push(rgbs); - } - - palette.rgb = RGB; - - palettes.push(palette); - } - } - - if (Object.keys(assets).length > 0) { - output.assets = assets; - } - - output.palettes = palettes; - } - - private getPalette(habboAssetSWF: HabboAssetSWF, paletteName: string): Array | null { - const binaryData = this.getBinaryData(habboAssetSWF, paletteName, false); - if (binaryData !== null) { - const byteBuffer = ByteBuffer.wrap(binaryData); - const paletteColors: Array = new Array(); - - try { - let R = 0; - let G = 0; - let B = 0; - let counter = 1; - while ((binaryData.length - byteBuffer.offset) > 0) { - if (counter == 1) { - R = byteBuffer.readUInt8(); - } else if (counter == 2) { - G = byteBuffer.readUInt8(); - } else if (counter == 3) { - B = byteBuffer.readUInt8(); - paletteColors.push(new RGB(R, G, B)); - counter = 0; - } - counter++; - } - - return paletteColors; - } catch (err) { - console.log(err); - } - } - - return null; - } - - - private getBinaryData(habboAssetSWF: HabboAssetSWF, type: string, documentNameTwice: boolean): Buffer | null { - let binaryName = habboAssetSWF.getFullClassName(type, documentNameTwice); - let tag = habboAssetSWF.getBinaryTagByName(binaryName); - if (tag === null) { - binaryName = habboAssetSWF.getFullClassNameSnake(type, documentNameTwice, true); - tag = habboAssetSWF.getBinaryTagByName(binaryName); - } - if (tag === null) { - return null; - } - - return tag.binaryDataBuffer; - } - - private static mapIndexXML(indexXML: IndexXML, output: PetJson) { - output.name = indexXML.type; - output.logicType = indexXML.logic; - output.visualizationType = indexXML.visualization; - } - - private static mapLogicXML(logicXML: LogicXML, output: PetJson) { - output.dimensions = { - x: parseInt(logicXML.model.dimensions.x.toString()), - y: parseInt(logicXML.model.dimensions.y.toString()), - z: parseInt(logicXML.model.dimensions.z.toString()) - } - - const directions: Array = []; - if (logicXML.model.directions.length === 0) { - directions.push(0); - } else { - for (const direction of logicXML.model.directions) { - directions.push(parseInt(direction.id.toString())); - } - } - - if (logicXML.mask !== undefined) { - output.maskType = logicXML.mask.type; - } - - output.directions = directions; - } - - private static mapVisualizationXML(visualizationData: VisualizationDataXML, output: PetJson) { - const visualizationsArray: Array = new Array(); - - for (const visualization of visualizationData.visualizations) { - if (visualization.size == PetJsonMapper.VISUALIZATION_DEFAULT_SIZE || visualization.size == PetJsonMapper.VISUALIZATION_ICON_SIZE) { - const visualizationJson: Visualization = {} as any; - visualizationJson.angle = parseInt(visualization.angle.toString()); - visualizationJson.layerCount = parseInt(visualization.layerCount.toString()); - visualizationJson.size = parseInt(visualization.size.toString()); - - PetJsonMapper.mapVisualizationLayerXML(visualization, visualizationJson); - PetJsonMapper.mapVisualizationDirectionXML(visualization, visualizationJson); - PetJsonMapper.mapVisualizationColorXML(visualization, visualizationJson); - PetJsonMapper.mapVisualizationAnimationXML(visualization, visualizationJson); - PetJsonMapper.mapVisualizationPostureXML(visualization, visualizationJson); - PetJsonMapper.mapVisualizationGestureXML(visualization, visualizationJson); - - visualizationsArray.push(visualizationJson); - } - } - - output.visualizations = visualizationsArray; - } - - private static mapVisualizationLayerXML(visXML: VisualizationXML, output: Visualization) { - if (visXML.layers.length > 0) { - output.layers = PetJsonMapper.mapVisualizationLayersXML(visXML.layers); - } - } - - private static mapVisualizationLayersXML(layersXML: Array): VisualizationLayers { - const layers: VisualizationLayers = {}; - for (const layerXML of layersXML) { - const layer: Layer = {} as any; - if (layer.alpha !== undefined) - layer.alpha = parseInt(layerXML.alpha.toString()); - layer.ink = layerXML.ink; - layer.tag = layerXML.tag; - - if (layerXML.x !== undefined) - layer.x = parseInt(layerXML.x.toString()); - if (layerXML.y !== undefined) - layer.y = parseInt(layerXML.y.toString()); - if (layerXML.z !== undefined) - layer.z = parseInt(layerXML.z.toString()); - layer.ignoreMouse = layerXML.ignoreMouse as any; - - layers[layerXML.id] = layer; - } - - return layers; - } - - private static mapVisualizationDirectionXML(visXML: VisualizationXML, output: Visualization) { - if (visXML.directions.length > 0) { - const directions: Directions = {} as any; - for (const directionXML of visXML.directions) { - const direction: Direction = {} as any; - if (directionXML.layers.length > 0) { - direction.layers = PetJsonMapper.mapVisualizationLayersXML(directionXML.layers); - } - - directions[directionXML.id] = direction; - } - - if (Object.keys(directions).length > 0) { - output.directions = directions; - } - } - } - - private static mapVisualizationColorXML(visXML: VisualizationXML, output: Visualization) { - if (visXML.colors.length > 0) { - const colors: Colors = {}; - for (const colorXML of visXML.colors) { - if (colorXML.layers.length > 0) { - const color: Color = {} as any; - color.layers = PetJsonMapper.mapVisualizationColorLayerXML(colorXML); - - colors[colorXML.id] = color; - } - } - - if (Object.keys(colors).length > 0) { - output.colors = colors; - } - } - } - - private static mapVisualizationColorLayerXML(colorXML: ColorXML): ColorLayers { - const colorLayers: ColorLayers = {}; - for (const colorLayerXML of colorXML.layers) { - const colorLayer: ColorLayer = {} as any; - colorLayer.color = parseInt(colorLayerXML.color, 16); - - colorLayers[colorLayerXML.id] = colorLayer; - } - - return colorLayers; - } - - private static mapVisualizationAnimationXML(visXML: VisualizationXML, output: Visualization) { - if (visXML.animations.length > 0) { - const animations: Animations = {}; - for (const animationXML of visXML.animations) { - if (animationXML.layers.length > 0) { - const animation: Animation = {} as any; - - if (animationXML.transitionTo !== undefined) - animation.transitionTo = parseInt(animationXML.transitionTo.toString()); - if (animationXML.transitionFrom !== undefined) - animation.transitionFrom = parseInt(animationXML.transitionFrom.toString()); - animation.immediateChangeFrom = animationXML.immediateChangeFrom; - - animation.layers = PetJsonMapper.mapVisualizationAnimationLayerXML(animationXML); - - animations[animationXML.id] = animation; - } - } - - if (Object.keys(animations).length > 0) { - output.animations = animations; - } - } - } - - private static mapVisualizationAnimationLayerXML(animationXML: AnimationXML): AnimationLayers { - const animationLayers: AnimationLayers = {}; - for (const animationLayerXML of animationXML.layers) { - const animationLayer: AnimationLayer = {} as any; - if (animationLayerXML.frameRepeat !== undefined) - animationLayer.frameRepeat = parseInt(animationLayerXML.frameRepeat.toString()); - if (animationLayerXML.loopCount !== undefined) - animationLayer.loopCount = parseInt(animationLayerXML.loopCount.toString()); - if (animationLayerXML.random !== undefined) - animationLayer.random = parseInt(animationLayerXML.random.toString()); - - if (animationLayerXML.frameSequences.length > 0) { - animationLayer.frameSequences = PetJsonMapper.mapVisualizationFrameSequenceXML(animationLayerXML); - animationLayers[animationLayerXML.id] = animationLayer; - } - } - - return animationLayers; - } - - private static mapVisualizationFrameSequenceXML(animationLayerXML: AnimationLayerXML): FrameSequences { - const frameSequences: FrameSequences = {}; - let frameSequenceCount = 0; - for (const frameSequenceXML of animationLayerXML.frameSequences) { - const frameSequence: FrameSequence = {} as any; - - if (frameSequenceXML.frames.length > 0) { - let frameId = 0; - const frames: Frames = {}; - for (const frameXML of frameSequenceXML.frames) { - const frame: Frame = {} as any; - if (frameXML.x !== undefined) - frame.x = parseInt(frameXML.x.toString()); - if (frameXML.y !== undefined) - frame.y = parseInt(frameXML.y.toString()); - if (frameXML.randomX !== undefined) - frame.randomX = parseInt(frameXML.randomX.toString()); - if (frameXML.randomY !== undefined) - frame.randomY = parseInt(frameXML.randomY.toString()); - if (frameXML.id === "NaN") { - frame.id = 0; - } else { - frame.id = parseInt(frameXML.id); - } - if (frameXML.offsets.length > 0) { - const offsets: Array = new Array(); - for (const offsetXML of frameXML.offsets) { - const offset: Offset = {} as any; - offset.direction = parseInt(offsetXML.direction.toString()); - if (offsetXML.x !== undefined) - offset.x = parseInt(offsetXML.x.toString()); - if (offsetXML.y !== undefined) - offset.y = parseInt(offsetXML.y.toString()); - offsets.push(offset); - } - frame.offsets = offsets; - } - frames[frameId] = frame; - frameId++; - } - if (frameSequenceXML.loopCount !== undefined) - frameSequence.loopCount = parseInt(frameSequenceXML.loopCount.toString()); - if (frameSequenceXML.random !== undefined) - frameSequence.random = parseInt(frameSequenceXML.random.toString()); - frameSequence.frames = frames; - frameSequences[frameSequenceCount] = frameSequence; - } - frameSequenceCount++; - } - - return frameSequences; - } - - private static mapVisualizationPostureXML(visXML: VisualizationXML, output: Visualization) { - if (visXML.postures.length > 0) { - const postures: Postures = {}; - for (const postureXML of visXML.postures) { - const posture: Posture = {} as any; - posture.id = postureXML.id; - posture.animationId = parseInt(postureXML.animationId.toString()); - - postures[postureXML.id] = posture; - } - - if (Object.keys(postures).length > 0) { - output.postures = postures; - } - } - } - - private static mapVisualizationGestureXML(visXML: VisualizationXML, output: Visualization) { - if (visXML.gestures.length > 0) { - const gestures: Gestures = {}; - for (const gestureXML of visXML.gestures) { - const gesture: Gesture = {} as any; - gesture.id = gestureXML.id; - gesture.animationId = parseInt(gestureXML.animationId.toString()); - gestures[gestureXML.id] = gesture; - } - - if (Object.keys(gestures).length > 0) { - output.gestures = gestures; - } - } - } -} \ No newline at end of file diff --git a/src/pet/mapper/PetTypes.ts b/src/pet/mapper/PetTypes.ts deleted file mode 100644 index 29faca2..0000000 --- a/src/pet/mapper/PetTypes.ts +++ /dev/null @@ -1,175 +0,0 @@ -import {SpriteSheetType} from "../../bundle/BundleTypes"; - -export interface PetJson { - type: string, - name: string, - visualizationType: string, - logicType: string, - maskType: string, - credits: string, - - spritesheet: SpriteSheetType, - - dimensions: Dimensions, - action: Action; - directions: number[], - assets: PetAssets, - palettes: Array, - visualizations: Visualization[] -} - -export interface Palette { - id: number, - source: string, - color1: string, - color2: string, - - rgb: Array>; -} - -export interface Visualization { - layerCount: number, - angle: number, - size: number, - - layers: VisualizationLayers, - directions: Directions, - colors: Colors, - animations: Animations, - postures: Postures; - gestures: Gestures -} - -export interface Gestures { - [key: string]: Gesture -} - -export interface Gesture { - id: string, - animationId: number -} - -export interface Postures { - [key: string]: Posture -} - -export interface Posture { - id: string, - animationId: number -} - -export interface Offset { - direction: number, - x: number, - y: number -} - -export interface Frame { - id: number, - x: number, - y: number, - randomX: number, - randomY: number, - - offsets: Offset[] -} - -export interface Frames { - [key: number]: Frame -} - -export interface FrameSequence { - loopCount: number, - random: number, - - frames: Frames -} - -export interface FrameSequences { - [key: number]: FrameSequence -} - -export interface AnimationLayer { - loopCount: number, - frameRepeat: number, - random: number, - - frameSequences: FrameSequences -} - -export interface AnimationLayers { - [key: number]: AnimationLayer -} - -export interface Animations { - [key: number]: Animation -} - -export interface Animation { - transitionTo: number, - transitionFrom: number, - immediateChangeFrom: string, - - layers: AnimationLayers; -} - -export interface ColorLayers { - [key: number]: ColorLayer -} - -export interface ColorLayer { - color: number -} - -export interface Colors { - [key: number]: Color -} - -export interface Color { - layers: ColorLayers; -} - -export interface Directions { - [key: number]: Direction -} - -export interface Direction { - layers: VisualizationLayers; -} - -export interface VisualizationLayers { - [key: number]: Layer -} - -export interface Layer { - alpha: number, - x: number, - y: number, - z: number, - ink: string, - tag: string, - ignoreMouse: boolean -} - -export interface Action { - link: string, - startState: number -} - -export interface Dimensions { - x: number, - y: number, - z: number -} - -export interface PetAssets { - [key: string]: PetAsset -} - -export interface PetAsset { - source: string, - x: number, - y: number, - flipH: boolean, - usesPalette: boolean, -} \ No newline at end of file diff --git a/src/pet/mapper/PetXMLTypes.ts b/src/pet/mapper/PetXMLTypes.ts deleted file mode 100644 index ed9225c..0000000 --- a/src/pet/mapper/PetXMLTypes.ts +++ /dev/null @@ -1,290 +0,0 @@ -export class AssetsXML { - private readonly _assets: Array; - private readonly _palettes: Array; - - constructor(assetsXML: any) { - this._assets = new Array(); - - for (const asset of assetsXML.assets.asset) { - this._assets.push(new AssetXML(asset)); - } - - this._palettes = new Array(); - if (assetsXML.assets.palette !== undefined) - for (const palette of assetsXML.assets.palette) { - this._palettes.push(new PaletteXML(palette)); - } - } - - get assets(): Array { - return this._assets; - } - - get palettes(): Array { - return this._palettes; - } -} - -export class PaletteXML { - private readonly _id: number; - private readonly _source: string; - private readonly _color1: string; - private readonly _color2: string; - - constructor(paletteXML: any) { - const attributes = paletteXML.$; - - this._id = attributes.id; - this._source = attributes.source; - this._color1 = attributes.color1; - this._color2 = attributes.color2; - } - - get id(): number { - return this._id; - } - - get source(): string { - return this._source; - } - - get color1(): string { - return this._color1; - } - - get color2(): string { - return this._color2; - } -} - -export class AssetXML { - private readonly _name: string; - private readonly _source: string | undefined; - private readonly _x: number; - private readonly _y: number; - private readonly _flipH: boolean | undefined; - private readonly _usesPalette: number | undefined; - - constructor(asset: any) { - const attributes = asset.$; - - this._name = attributes.name; - - if (attributes.source !== undefined) - this._source = attributes.source; - - this._x = attributes.x; - - this._y = attributes.y; - - if (attributes.flipH !== undefined) - this._flipH = attributes.flipH === '1'; - - if (attributes.usesPalette !== undefined) - this._usesPalette = attributes.usesPalette; - } - - get name(): string { - return this._name; - } - - get source(): string | undefined { - return this._source; - } - - get x(): number { - return this._x; - } - - get y(): number { - return this._y; - } - - get flipH(): boolean | undefined { - return this._flipH; - } - - get usesPalette(): number | undefined { - return this._usesPalette; - } -} - -export class IndexXML { - private readonly _type: string; - private readonly _visualization: string; - private readonly _logic: string; - - constructor(indexXML: any) { - const attributes = indexXML.$; - - this._type = attributes.type; - this._visualization = attributes.visualization; - this._logic = attributes.logic; - } - - get type(): string { - return this._type; - } - - get visualization(): string { - return this._visualization; - } - - get logic(): string { - return this._logic; - } -} - -export class LogicXML { - private readonly _type: string; - private readonly _model: ModelXML; - private readonly _action: ActionXML | undefined; - private readonly _mask: MaskXML | undefined; - private readonly _credits: CreditsXML | undefined; - - constructor(logicXML: any) { - const attributes = logicXML.$; - this._type = attributes.type; - - this._model = new ModelXML(logicXML.model[0]); - if (logicXML.action !== undefined) - this._action = new ActionXML(logicXML.action[0]); - - if (logicXML.mask !== undefined) - this._mask = new MaskXML(logicXML.mask[0]); - - if (logicXML.credits !== undefined) - this._credits = new CreditsXML(logicXML.credits[0]); - } - - get type(): string { - return this._type; - } - - get model(): ModelXML { - return this._model; - } - - get action(): ActionXML | undefined { - return this._action; - } - - get mask(): MaskXML | undefined { - return this._mask; - } - - get credits(): CreditsXML | undefined { - return this._credits; - } -} - -export class ModelXML { - private readonly _dimensions: DimensionsXML; - private readonly _directions: Array; - - constructor(modelXML: any) { - this._dimensions = new DimensionsXML(modelXML.dimensions[0]); - this._directions = new Array(); - - if (Array.isArray(modelXML.directions)) { - for (const directionParent of modelXML.directions) { - if (Array.isArray(directionParent.direction)) { - for (const direction of directionParent.direction) { - this._directions.push(new DirectionXML(direction.$)); - } - } else { - console.log(directionParent.direction); - } - } - } - } - - get dimensions(): DimensionsXML { - return this._dimensions; - } - - get directions(): Array { - return this._directions; - } -} - -export class DimensionsXML { - private readonly _x: number; - private readonly _y: number; - private readonly _z: number; - - constructor(dimensionsXML: any) { - const attributes = dimensionsXML.$; - - this._x = attributes.x; - this._y = attributes.y; - this._z = attributes.z; - } - - get x(): number { - return this._x; - } - - get y(): number { - return this._y; - } - - get z(): number { - return this._z; - } -} - -export class DirectionXML { - private readonly _id: number; - - constructor(directionXML: any) { - this._id = directionXML.id; - } - - get id(): number { - return this._id; - } -} - -export class ActionXML { - private readonly _link: string; - private readonly _startState: number; - - constructor(actionXML: any) { - const attributes = actionXML.$; - this._link = attributes.link; - this._startState = attributes.startState; - } - - get link(): string { - return this._link; - } - - get startState(): number { - return this._startState; - } -} - -export class MaskXML { - private readonly _type: string; - - constructor(maskXML: any) { - this._type = maskXML.$.type; - } - - get type(): string { - return this._type; - } -} - -export class CreditsXML { - private readonly _value: string; - - constructor(creditsXML: any) { - this._value = creditsXML.$.value; - } - - get value(): string { - return this._value; - } -} \ No newline at end of file diff --git a/src/pet/mapper/RGB.ts b/src/pet/mapper/RGB.ts deleted file mode 100644 index 00d5354..0000000 --- a/src/pet/mapper/RGB.ts +++ /dev/null @@ -1,23 +0,0 @@ -export default class RGB { - private readonly _r: number; - private readonly _g: number; - private readonly _b: number; - - constructor(r: number, g: number, b: number) { - this._r = r; - this._g = g; - this._b = b; - } - - get r(): number { - return this._r; - } - - get g(): number { - return this._g; - } - - get b(): number { - return this._b; - } -} \ No newline at end of file diff --git a/src/pet/mapper/VisualizationXMLTypes.ts b/src/pet/mapper/VisualizationXMLTypes.ts deleted file mode 100644 index 0956cb1..0000000 --- a/src/pet/mapper/VisualizationXMLTypes.ts +++ /dev/null @@ -1,517 +0,0 @@ -export class VisualizationDataXML { - - private readonly _type: string; - private readonly _visualizations: Array; - - constructor(visualizationXML: any) { - this._type = visualizationXML.$.type; - this._visualizations = new Array(); - - if (Array.isArray(visualizationXML.graphics)) { - for (const graphic of visualizationXML.graphics) { - for (const visualization of graphic.visualization) { - this._visualizations.push(new VisualizationXML(visualization)); - } - } - } - } - - get type(): string { - return this._type; - } - - get visualizations(): Array { - return this._visualizations; - } -} - -export class VisualizationXML { - - private readonly _size: number; - private readonly _layerCount: number; - private readonly _angle: number; - - private readonly _layers: Array; - private readonly _directions: Array; - private readonly _colors: Array; - private readonly _animations: Array; - private readonly _postures: Array; - private readonly _gestures: Array; - - constructor(visualizationXML: any) { - const attributes = visualizationXML.$; - this._size = attributes.size; - this._layerCount = attributes.layerCount; - this._angle = attributes.angle; - - this._layers = new Array(); - if (visualizationXML.layers !== undefined) - for (const layerParent of visualizationXML.layers) { - if (Array.isArray(layerParent.layer)) { - for (const layer of layerParent.layer) { - this._layers.push(new LayerXML(layer)); - } - } - } - - this._directions = new Array(); - if (visualizationXML.directions !== undefined) { - for (const directionParent of visualizationXML.directions) { - if (Array.isArray(directionParent.direction)) { - for (const direction of directionParent.direction) { - this._directions.push(new DirectionXML(direction)); - } - } - } - } - - this._colors = new Array(); - if (visualizationXML.colors !== undefined) { - for (const colorParent of visualizationXML.colors) { - if (Array.isArray(colorParent.color)) { - for (const color of colorParent.color) { - this._colors.push(new ColorXML(color)); - } - } - } - } - - this._animations = new Array(); - if (visualizationXML.animations !== undefined) { - for (const animationParent of visualizationXML.animations) { - if (Array.isArray(animationParent.animation)) { - for (const animation of animationParent.animation) { - this._animations.push(new AnimationXML(animation)); - } - } - } - } - - this._postures = new Array(); - if (visualizationXML.postures !== undefined) { - for (const postureParent of visualizationXML.postures) { - if (Array.isArray(postureParent.posture)) { - for (const posture of postureParent.posture) { - this._postures.push(new PostureXML(posture)); - } - } - } - } - this._gestures = new Array(); - if (visualizationXML.gestures !== undefined) { - for (const gestureParent of visualizationXML.gestures) { - if (Array.isArray(gestureParent.gesture)) { - for (const gesture of gestureParent.gesture) { - this._gestures.push(new GestureXML(gesture)); - } - } - } - } - } - - get size(): number { - return this._size; - } - - get layerCount(): number { - return this._layerCount; - } - - get angle(): number { - return this._angle; - } - - get layers(): Array { - return this._layers; - } - - get directions(): Array { - return this._directions; - } - - get colors(): Array { - return this._colors; - } - - get animations(): Array { - return this._animations; - } - - get postures(): Array { - return this._postures; - } - - get gestures(): Array { - return this._gestures; - } -} - -export class LayerXML { - private readonly _id: number; - private readonly _alpha: number; - private readonly _x: number; - private readonly _y: number; - private readonly _z: number; - private readonly _ink: string; - private readonly _tag: string; - private readonly _ignoreMouse: boolean | undefined; - - constructor(layerXML: any) { - const attributes = layerXML.$; - - this._id = attributes.id; - this._alpha = attributes.alpha; - this._x = attributes.x; - this._y = attributes.y; - this._z = attributes.z; - this._ink = attributes.ink; - this._tag = attributes.tag; - if (attributes.ignoreMouse !== undefined) { - this._ignoreMouse = attributes.ignoreMouse === '1'; - } - } - - get id(): number { - return this._id; - } - - get alpha(): number { - return this._alpha; - } - - get x(): number { - return this._x; - } - - get y(): number { - return this._y; - } - - get z(): number { - return this._z; - } - - get ink(): string { - return this._ink; - } - - get tag(): string { - return this._tag; - } - - get ignoreMouse(): boolean | undefined { - return this._ignoreMouse; - } -} - -export class DirectionXML { - private readonly _id: number; - private readonly _layers: Array; - - constructor(directionXML: any) { - this._id = directionXML.$.id; - - this._layers = new Array(); - if (directionXML.layer !== undefined) { - for (const layer of directionXML.layer) { - this._layers.push(new LayerXML(layer)); - } - } - } - - get id(): number { - return this._id; - } - - get layers(): Array { - return this._layers; - } -} - -export class ColorXML { - private readonly _id: number; - private readonly _layers: Array; - - constructor(colorXML: any) { - this._id = colorXML.$.id; - - this._layers = new Array(); - for (const colorLayer of colorXML.colorLayer) { - this._layers.push(new ColorLayerXML(colorLayer)); - } - } - - - get id(): number { - return this._id; - } - - get layers(): Array { - return this._layers; - } -} - -export class ColorLayerXML { - private readonly _id: number; - private readonly _color: string; - - constructor(colorLayerXML: any) { - const attributes = colorLayerXML.$; - this._id = attributes.id; - this._color = attributes.color; - } - - get id(): number { - return this._id; - } - - get color(): string { - return this._color; - } -} - -export class AnimationXML { - private readonly _id: number; - private readonly _transitionTo: number; - private readonly _transitionFrom: number; - private readonly _immediateChangeFrom: string; - private readonly _layers: Array; - - constructor(animationXML: any) { - const attributes = animationXML.$; - this._id = attributes.id; - this._transitionTo = attributes.transitionTo; - this._transitionFrom = attributes.transitionFrom; - this._immediateChangeFrom = attributes.immediateChangeFrom; - - this._layers = new Array(); - if (animationXML.animationLayer !== undefined) { - for (const animationLayer of animationXML.animationLayer) { - this._layers.push(new AnimationLayerXML(animationLayer)) - } - } - } - - get id(): number { - return this._id; - } - - get transitionTo(): number { - return this._transitionTo; - } - - get transitionFrom(): number { - return this._transitionFrom; - } - - get immediateChangeFrom(): string { - return this._immediateChangeFrom; - } - - get layers(): Array { - return this._layers; - } -} - -export class AnimationLayerXML { - private readonly _id: number; - private readonly _loopCount: number; - private readonly _frameRepeat: number; - private readonly _random: number; - private readonly _randomStart: number; - - private readonly _frameSequences: Array; - - constructor(animationLayerXML: any) { - const attributes = animationLayerXML.$; - this._id = attributes.id; - this._loopCount = attributes.loopCount; - this._frameRepeat = attributes.frameRepeat; - this._random = attributes.random; - this._randomStart = attributes.randomStart; - - this._frameSequences = new Array(); - if (animationLayerXML.frameSequence !== undefined) { - for (const frameSequence of animationLayerXML.frameSequence) { - this._frameSequences.push(new FrameSequenceXML(frameSequence)); - } - } - } - - get id(): number { - return this._id; - } - - get loopCount(): number { - return this._loopCount; - } - - get frameRepeat(): number { - return this._frameRepeat; - } - - get random(): number { - return this._random; - } - - get randomStart(): number { - return this._randomStart; - } - - get frameSequences(): Array { - return this._frameSequences; - } -} - -export class FrameSequenceXML { - private readonly _loopCount: number; - private readonly _random: number; - - private readonly _frames: Array; - - constructor(frameSequenceXML: any) { - let attributes = frameSequenceXML.$; - if (attributes === undefined) attributes = {}; - - this._loopCount = attributes.loopCount; - this._random = attributes.random; - - this._frames = new Array(); - if (frameSequenceXML.frame !== undefined) { - for (const frame of frameSequenceXML.frame) { - this._frames.push(new FrameXML(frame)); - } - } - } - - get loopCount(): number { - return this._loopCount; - } - - get random(): number { - return this._random; - } - - get frames(): Array { - return this._frames; - } -} - -export class FrameXML { - private readonly _id: string; - private readonly _x: number; - private readonly _y: number; - private readonly _randomX: number; - private readonly _randomY: number; - - private readonly _offsets: Array; - - constructor(frameXML: any) { - const attributes = frameXML.$; - - this._id = attributes.id; - this._x = attributes.x; - this._y = attributes.y; - this._randomX = attributes.randomX; - this._randomY = attributes.randomY; - - this._offsets = new Array(); - if (frameXML.offsets !== undefined) { - for (const offsetParent of frameXML.offsets) { - for (const offset of offsetParent.offset) { - this._offsets.push(new OffsetXML(offset)); - } - } - } - } - - get id(): string { - return this._id; - } - - get x(): number { - return this._x; - } - - get y(): number { - return this._y; - } - - get randomX(): number { - return this._randomX; - } - - get randomY(): number { - return this._randomY; - } - - get offsets(): Array { - return this._offsets; - } -} - -export class OffsetXML { - private readonly _direction: number; - private readonly _x: number; - private readonly _y: number; - - constructor(offsetXML: any) { - const attributes = offsetXML.$; - - this._direction = attributes.direction; - this._x = attributes.x; - this._y = attributes.y; - } - - get direction(): number { - return this._direction; - } - - get x(): number { - return this._x; - } - - get y(): number { - return this._y; - } -} - -export class PostureXML { - private readonly _id: string; - private readonly _animationId: number; - - constructor(postureXML: any) { - const attributes = postureXML.$; - - this._id = attributes.id; - this._animationId = attributes.animationId; - } - - get id(): string { - return this._id; - } - - get animationId(): number { - return this._animationId; - } -} - -export class GestureXML { - private readonly _id: string; - private readonly _animationId: number; - - constructor(gestureXML: any) { - const attributes = gestureXML.$; - - this._id = attributes.id; - this._animationId = attributes.animationId; - } - - get id(): string { - return this._id; - } - - get animationId(): number { - return this._animationId; - } -} \ No newline at end of file diff --git a/src/swf/HabboAssetSWF.ts b/src/swf/HabboAssetSWF.ts index 80eedd1..488b8cc 100644 --- a/src/swf/HabboAssetSWF.ts +++ b/src/swf/HabboAssetSWF.ts @@ -1,32 +1,36 @@ -import {ImageTagData, readImagesDefineBitsLossless, readImagesJPEG, readSwfAsync} from "../utils/SwfReader"; -import ITag from "./tags/ITag"; -import SymbolClassTag from "./tags/SymbolClassTag"; -import DefineBinaryDataTag from "./tags/DefineBinaryDataTag"; -import ImageTag from "./tags/ImageTag"; -import CustomIterator from "../utils/CustomIterator"; -import CharacterTag from "./tags/CharacterTag"; - -export default class HabboAssetSWF { +import CustomIterator from '../utils/CustomIterator'; +import { readImagesDefineBitsLossless, readImagesJPEG, readSwfAsync } from '../utils/SwfReader'; +import { CharacterTag } from './tags/CharacterTag'; +import { DefineBinaryDataTag } from './tags/DefineBinaryDataTag'; +import { ImageTag } from './tags/ImageTag'; +import { ITag } from './tags/ITag'; +import { SymbolClassTag } from './tags/SymbolClassTag'; +export class HabboAssetSWF +{ private readonly _tags: Array; private _documentClass: string | null = null; constructor( private readonly _data: string | Buffer - ) { + ) + { this._tags = new Array(); } - async setupAsync() { + async setupAsync() + { const swf = await readSwfAsync(this._data); - for (const tag of swf.tags) { + for(const tag of swf.tags) + { - switch (tag.header.code) { + switch(tag.header.code) + { case 76: this._tags.push(new SymbolClassTag(tag.symbols)); break; case 87: - this._tags.push(new DefineBinaryDataTag(tag.data)) + this._tags.push(new DefineBinaryDataTag(tag.data)); break; case 6: @@ -78,35 +82,45 @@ export default class HabboAssetSWF { this.assignClassesToSymbols(); } - public imageTags(): Array { + public imageTags(): Array + { return this._tags.filter((tag: ITag) => tag instanceof ImageTag).map(x => x as ImageTag); } - public symbolTags(): Array { - return this._tags.filter((tag: ITag) => tag instanceof SymbolClassTag).map(x => x as SymbolClassTag) + public symbolTags(): Array + { + return this._tags.filter((tag: ITag) => tag instanceof SymbolClassTag).map(x => x as SymbolClassTag); } - private binaryTags(): Array { + private binaryTags(): Array + { return this._tags.filter((tag: ITag) => tag instanceof DefineBinaryDataTag).map(x => x as DefineBinaryDataTag); } - private assignClassesToSymbols() { + private assignClassesToSymbols() + { const classes: Map = new Map(); let iterator: CustomIterator = new CustomIterator(this._tags); - while (true) { + while(true) + { let t: ITag; - do { - if (!iterator.hasNext()) { + do + { + if(!iterator.hasNext()) + { iterator = new CustomIterator(this._tags); - while (iterator.hasNext()) { + while(iterator.hasNext()) + { t = iterator.next(); - if (t instanceof CharacterTag) { + if(t instanceof CharacterTag) + { const ct = t as CharacterTag; - if (classes.has(ct.characterId)) { + if(classes.has(ct.characterId)) + { // @ts-ignore ct.className = classes.get(ct.characterId); } @@ -117,67 +131,82 @@ export default class HabboAssetSWF { } t = iterator.next(); - } while (!(t instanceof SymbolClassTag)); + } while(!(t instanceof SymbolClassTag)); const sct = t as SymbolClassTag; - for (let i = 0; i < sct.tags.length; ++i) { - if (!classes.has(sct.tags[i]) && !Array.from(classes.values()).includes(sct.names[i])) { + for(let i = 0; i < sct.tags.length; ++i) + { + if(!classes.has(sct.tags[i]) && !Array.from(classes.values()).includes(sct.names[i])) + { classes.set(sct.tags[i], sct.names[i]); } } } } - public getBinaryTagByName(name: string): DefineBinaryDataTag | null { + public getBinaryTagByName(name: string): DefineBinaryDataTag | null + { const streamTag = this.binaryTags() .filter(tag => tag.className === name)[0]; - if (streamTag === undefined) return null; + if(streamTag === undefined) return null; return streamTag; } - public getFullClassName(type: string, documentNameTwice: boolean): string { + public getFullClassName(type: string, documentNameTwice: boolean): string + { return this.getFullClassNameSnake(type, documentNameTwice, false); } - public getFullClassNameSnake(type: string, documentNameTwice: boolean, snakeCase: boolean): string { - let result: string = this.getDocumentClass() + "_"; - if (documentNameTwice) { - if (snakeCase) { + public getFullClassNameSnake(type: string, documentNameTwice: boolean, snakeCase: boolean): string + { + let result: string = this.getDocumentClass() + '_'; + if(documentNameTwice) + { + if(snakeCase) + { //result += CaseFormat.UPPER_CAMEL.to(CaseFormat.LOWER_UNDERSCORE, this.swf.getDocumentClass()) + "_"; - } else { - result += this.getDocumentClass() + "_"; + } + else + { + result += this.getDocumentClass() + '_'; } } return result + type; } - public getDocumentClass(): string { - if (this._documentClass !== null) return this._documentClass; + public getDocumentClass(): string + { + if(this._documentClass !== null) return this._documentClass; - let iterator: CustomIterator = new CustomIterator(this._tags); + const iterator: CustomIterator = new CustomIterator(this._tags); - while (true) { + while(true) + { let t: ITag; - do { - if (!iterator.hasNext()) { - return ""; + do + { + if(!iterator.hasNext()) + { + return ''; } t = iterator.next(); - } while (!(t instanceof SymbolClassTag)); + } while(!(t instanceof SymbolClassTag)); const sc = t as SymbolClassTag; - for (let i = 0; i < sc.tags.length; ++i) { - if (sc.tags[i] == 0) { + for(let i = 0; i < sc.tags.length; ++i) + { + if(sc.tags[i] == 0) + { this._documentClass = sc.names[i]; return this._documentClass; } } } } -} \ No newline at end of file +} diff --git a/src/swf/tags/CharacterTag.ts b/src/swf/tags/CharacterTag.ts index e6b0a0d..2f44f53 100644 --- a/src/swf/tags/CharacterTag.ts +++ b/src/swf/tags/CharacterTag.ts @@ -1,20 +1,25 @@ -export default abstract class CharacterTag { - private _className: string = ""; +export abstract class CharacterTag +{ + private _className: string = ''; private _characterId: number = -1; - get className(): string { + public get className(): string + { return this._className; } - set className(value: string) { + public set className(value: string) + { this._className = value; } - get characterId(): number { + public get characterId(): number + { return this._characterId; } - set characterId(value: number) { + public set characterId(value: number) + { this._characterId = value; } -} \ No newline at end of file +} diff --git a/src/swf/tags/DefineBinaryDataTag.ts b/src/swf/tags/DefineBinaryDataTag.ts index bf1df90..bf70123 100644 --- a/src/swf/tags/DefineBinaryDataTag.ts +++ b/src/swf/tags/DefineBinaryDataTag.ts @@ -1,14 +1,15 @@ -import ITag from "./ITag"; -import CharacterTag from "./CharacterTag"; - -export default class DefineBinaryDataTag extends CharacterTag implements ITag { +import { CharacterTag } from './CharacterTag'; +import { ITag } from './ITag'; +export class DefineBinaryDataTag extends CharacterTag implements ITag +{ private readonly _tag: number; private readonly _reserved: number; private readonly _binaryData: string; private readonly _binaryDataBuffer: Buffer; - constructor(buffer: Buffer) { + constructor(buffer: Buffer) + { super(); this._tag = buffer.readUInt16LE(0); @@ -17,29 +18,34 @@ export default class DefineBinaryDataTag extends CharacterTag implements ITag { const end = buffer.length; const binary = buffer.slice(start, end); - this._binaryData = binary.toString("utf-8"); + this._binaryData = binary.toString('utf-8'); this._binaryDataBuffer = binary; this.characterId = this._tag; } - get code(): number { + public get code(): number + { return 87; } - get tag(): number { + public get tag(): number + { return this._tag; } - get reserved(): number { + public get reserved(): number + { return this._reserved; } - get binaryData(): string { + public get binaryData(): string + { return this._binaryData; } - get binaryDataBuffer(): Buffer { + public get binaryDataBuffer(): Buffer + { return this._binaryDataBuffer; } -} \ No newline at end of file +} diff --git a/src/swf/tags/ISymbolClass.ts b/src/swf/tags/ISymbolClass.ts new file mode 100644 index 0000000..eff598d --- /dev/null +++ b/src/swf/tags/ISymbolClass.ts @@ -0,0 +1,5 @@ +export interface ISymbolClass +{ + id: number; + name: string; +} diff --git a/src/swf/tags/ITag.ts b/src/swf/tags/ITag.ts index 7ffb142..3fda0cf 100644 --- a/src/swf/tags/ITag.ts +++ b/src/swf/tags/ITag.ts @@ -1,3 +1,4 @@ -export default interface ITag { +export interface ITag +{ code: number; -} \ No newline at end of file +} diff --git a/src/swf/tags/ImageTag.ts b/src/swf/tags/ImageTag.ts index 1c091ca..422cec1 100644 --- a/src/swf/tags/ImageTag.ts +++ b/src/swf/tags/ImageTag.ts @@ -1,8 +1,8 @@ -import ITag from "./ITag"; -import CharacterTag from "./CharacterTag"; - -export default class ImageTag extends CharacterTag implements ITag { +import { CharacterTag } from './CharacterTag'; +import { ITag } from './ITag'; +export class ImageTag extends CharacterTag implements ITag +{ private readonly _code: number; private readonly _characterID: number; private readonly _imgType: string; @@ -11,7 +11,8 @@ export default class ImageTag extends CharacterTag implements ITag { private readonly _bitmapWidth: number; private readonly _bitmapHeight: number; - constructor(image: { code: number, characterID: number, imgType: string, imgData: Buffer, bitmapWidth: number, bitmapHeight: number }) { + constructor(image: { code: number, characterID: number, imgType: string, imgData: Buffer, bitmapWidth: number, bitmapHeight: number }) + { super(); this._code = image.code; @@ -25,27 +26,33 @@ export default class ImageTag extends CharacterTag implements ITag { this._bitmapHeight = image.bitmapHeight; } - get code(): number { + public get code(): number + { return this._code; - }; + } - get characterID(): number { + public get characterID(): number + { return this._characterID; } - get imgType(): string { + public get imgType(): string + { return this._imgType; } - get imgData(): Buffer { + public get imgData(): Buffer + { return this._imgData; } - get bitmapWidth(): number { + public get bitmapWidth(): number + { return this._bitmapWidth; } - get bitmapHeight(): number { + public get bitmapHeight(): number + { return this._bitmapHeight; } -} \ No newline at end of file +} diff --git a/src/swf/tags/SymbolClassTag.ts b/src/swf/tags/SymbolClassTag.ts index a790ed0..5cbef6a 100644 --- a/src/swf/tags/SymbolClassTag.ts +++ b/src/swf/tags/SymbolClassTag.ts @@ -1,34 +1,35 @@ -import ITag from "./ITag"; +import { ISymbolClass } from './ISymbolClass'; +import { ITag } from './ITag'; -export interface SymbolClass { - id: number, - name: string -} +export class SymbolClassTag implements ITag +{ + private readonly _tags: number[]; + private readonly _names: string[]; -export default class SymbolClassTag implements ITag { - - private readonly _tags: Array; - private readonly _names: Array; - - constructor(tags: Array) { + constructor(tags: ISymbolClass[]) + { this._tags = []; this._names = []; - for (const symbolClass of tags) { + for(const symbolClass of tags) + { this._tags.push(symbolClass.id); this._names.push(symbolClass.name); } } - get tags(): Array { + public get tags(): number[] + { return this._tags; } - get names(): Array { + public get names(): string[] + { return this._names; } - get code(): number { + public get code(): number + { return 76; } -} \ No newline at end of file +} diff --git a/src/utils/CustomIterator.ts b/src/utils/CustomIterator.ts index 355fc48..f0a13fa 100644 --- a/src/utils/CustomIterator.ts +++ b/src/utils/CustomIterator.ts @@ -1,4 +1,5 @@ -export default class CustomIterator { +export default class CustomIterator +{ private idx: number; private readonly top: number; @@ -6,8 +7,10 @@ export default class CustomIterator { private readonly arr: boolean; private readonly collection: Array; - constructor(collection: Array) { - if (this.dontIterate(collection)) { + constructor(collection: Array) + { + if(this.dontIterate(collection)) + { throw new Error('Oh you nasty man, I won\'t iterate over that (' + collection + ')!'); } @@ -15,10 +18,14 @@ export default class CustomIterator { this.idx = 0; this.top = 0; this.keys = []; - if (this.arr) { + if(this.arr) + { this.top = collection.length; - } else { - for (const prop in collection) { + } + else + { + for(const prop in collection) + { this.keys.push(prop); } } @@ -26,7 +33,8 @@ export default class CustomIterator { this.collection = collection; } - isArray(candidate: any) { + isArray(candidate: any) + { return candidate && typeof candidate === 'object' && typeof candidate.length === 'number' && @@ -34,21 +42,25 @@ export default class CustomIterator { !(candidate.propertyIsEnumerable('length')); } - dontIterate(collection: any) { + dontIterate(collection: any) + { // put some checks chere for stuff that isn't iterable (yet) return (!collection || typeof collection === 'number' || typeof collection === 'boolean'); } - public next(): TType { - if (!this.hasNext()) { + public next(): TType + { + if(!this.hasNext()) + { throw new Error('Oh you nasty man. I have no more elements.'); } const elem = this.arr ? this.collection[this.idx] : this.collection[this.keys[this.idx]]; ++this.idx; return elem; - }; + } - public hasNext() { + public hasNext() + { return this.arr ? this.idx <= this.top : this.idx <= this.keys.length; - }; + } } \ No newline at end of file diff --git a/src/utils/File.ts b/src/utils/File.ts index de2275e..72fd60c 100644 --- a/src/utils/File.ts +++ b/src/utils/File.ts @@ -1,39 +1,46 @@ -import {RmDirOptions, RmOptions} from "fs"; +import { RmOptions } from 'fs'; -const fs = require("fs"); +const fs = require('fs'); -export default class File { +export default class File +{ private readonly _path: string; - constructor(path: string) { + constructor(path: string) + { this._path = path; } - public exists(): boolean { + public exists(): boolean + { return fs.existsSync(this._path); } - public mkdirs(): void { + public mkdirs(): void + { return fs.mkdirSync(this._path); } - public list(): string[] { + public list(): string[] + { const test = fs.readdirSync(this._path); - console.log(test); return test; } - public isDirectory(): boolean { - return this.exists() && fs.lstatSync(this._path).isDirectory() + public isDirectory(): boolean + { + return this.exists() && fs.lstatSync(this._path).isDirectory(); } - get path(): string { + get path(): string + { return this._path; } - public rmdir(options: RmOptions): void { + public rmdir(options: RmOptions): void + { return fs.rmSync(this._path, options); } -} \ No newline at end of file +} diff --git a/src/utils/FileUtilities.ts b/src/utils/FileUtilities.ts new file mode 100644 index 0000000..848bbb9 --- /dev/null +++ b/src/utils/FileUtilities.ts @@ -0,0 +1,69 @@ +import { readFile } from 'fs'; +import * as fetch from 'node-fetch'; +import { promisify } from 'util'; + +const readFileAsync = promisify(readFile); + +export class FileUtilities +{ + public static async readFileAsBuffer(url: string): Promise + { + if(!url) return null; + + let content: Buffer = null; + + try + { + if(url.startsWith('http')) + { + const data = await fetch.default(url); + const arrayBuffer = await data.arrayBuffer(); + + if(arrayBuffer) content = Buffer.from(arrayBuffer); + } + else + { + content = await readFileAsync(url); + } + + return content; + } + + catch(error) + { + console.log(); + console.error(error); + } + } + + public static async readFileAsString(url: string): Promise + { + if(!url) return null; + + let content = null; + + try + { + if(url.startsWith('http')) + { + const data = await fetch.default(url); + + if(data) content = await data.text(); + } + else + { + const data = await readFileAsync(url); + + content = data.toString('utf-8'); + } + + return content; + } + + catch(error) + { + console.log(); + console.error(error); + } + } +} diff --git a/src/utils/Logger.ts b/src/utils/Logger.ts index 4c6d4b3..df7f0ff 100644 --- a/src/utils/Logger.ts +++ b/src/utils/Logger.ts @@ -1,19 +1,23 @@ -import {singleton} from "tsyringe"; +import { singleton } from 'tsyringe'; const fs = require('fs'); const fsAsync = require('fs/promises'); @singleton() -export default class Logger { +export default class Logger +{ - constructor() { - if (!fs.existsSync("error.log")) { - const createStream = fs.createWriteStream("error.log"); + constructor() + { + if(!fs.existsSync('error.log')) + { + const createStream = fs.createWriteStream('error.log'); createStream.end(); } } - public logErrorAsync(message: string): Promise { - return fsAsync.appendFile("error.log", message + "\n"); + public logErrorAsync(message: string): Promise + { + return fsAsync.appendFile('error.log', message + '\n'); } } \ No newline at end of file diff --git a/src/utils/NitroBundle.ts b/src/utils/NitroBundle.ts index cd7af7f..43bc068 100644 --- a/src/utils/NitroBundle.ts +++ b/src/utils/NitroBundle.ts @@ -1,25 +1,30 @@ const ByteBuffer = require('bytebuffer'); -const {gzip} = require('node-gzip'); +const { gzip } = require('node-gzip'); -export default class NitroBundle { +export default class NitroBundle +{ private readonly _files: Map; - constructor() { + constructor() + { this._files = new Map(); } - addFile(name: string, data: Buffer) { + addFile(name: string, data: Buffer) + { this._files.set(name, data); } - async toBufferAsync() { + async toBufferAsync() + { const buffer = new ByteBuffer(); buffer.writeUInt16(this._files.size); const iterator = this._files.entries(); let result: IteratorResult<[string, Buffer]> = iterator.next(); - while (!result.done) { + while(!result.done) + { const fileName = result.value[0]; const file = result.value[1]; diff --git a/src/utils/SlicedToArray.ts b/src/utils/SlicedToArray.ts new file mode 100644 index 0000000..1ec28bc --- /dev/null +++ b/src/utils/SlicedToArray.ts @@ -0,0 +1,51 @@ +export class SlicedToArray +{ + public static slicedToArray(arr: any, i: any): any[] + { + if(Array.isArray(arr)) return arr; + + if(Symbol.iterator in Object(arr)) return SlicedToArray.sliceIterator(arr, i); + + throw new TypeError('Invalid attempt to destructure non-iterable instance'); + } + + private static sliceIterator(arr: any, i: any): any[] + { + const _arr = []; + + let _n = true; + let _d = false; + let _e = undefined; + + try + { + for(var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) + { + _arr.push(_s.value); + + if(i && _arr.length === i) break; + } + } + + catch (err) + { + _d = true; + _e = err; + } + + finally + { + try + { + if(!_n && _i['return']) _i['return'](); + } + + finally + { + if(_d) throw _e; + } + } + + return _arr; + } +} diff --git a/tsconfig.json b/tsconfig.json index 2357b64..2bd49d1 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,20 +1,26 @@ { - "compilerOptions": { - "target": "es5", - "module": "commonjs", - "lib": ["es6"], - "allowJs": true, - "outDir": "dist", - "rootDir": "src", - "strict": true, - "noImplicitAny": true, - "esModuleInterop": true, - "resolveJsonModule": true, - "experimentalDecorators": true, - "emitDecoratorMetadata": true - }, - "include": [ - "src/config.json", - "src/**/*.ts" - ] -} \ No newline at end of file + "compilerOptions": { + "module": "commonjs", + "declaration": true, + "noImplicitAny": false, + "noUnusedLocals": false, + "removeComments": true, + "noLib": false, + "emitDecoratorMetadata": true, + "experimentalDecorators": true, + "resolveJsonModule": true, + "target": "es6", + "sourceMap": false, + "allowJs": false, + "baseUrl": "./src", + "outDir": "./dist" + }, + "include": [ + "src/configuration.json", + "src/**/*.ts" + ], + "exclude": [ + "node_modules", + "dist" + ] +}