├── .gitignore ├── LICENSE ├── README.md ├── package-lock.json ├── package.json ├── public └── index.html ├── rollup.config.js ├── screenshot.png └── src ├── App.svelte ├── components ├── Map │ ├── Map.svelte │ └── hash.js ├── Mesh │ ├── Mesh.svelte │ ├── geometry.js │ ├── mesh.js │ ├── renderer.js │ ├── texture.js │ └── tiles.js └── common │ ├── config.js │ ├── places.js │ └── position.js ├── global.css └── main.js /.gitignore: -------------------------------------------------------------------------------- 1 | /node_modules 2 | /public/* 3 | !/public/index.html 4 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Mozilla Public License Version 2.0 2 | ================================== 3 | 4 | 1. Definitions 5 | -------------- 6 | 7 | 1.1. "Contributor" 8 | means each individual or legal entity that creates, contributes to 9 | the creation of, or owns Covered Software. 10 | 11 | 1.2. "Contributor Version" 12 | means the combination of the Contributions of others (if any) used 13 | by a Contributor and that particular Contributor's Contribution. 14 | 15 | 1.3. "Contribution" 16 | means Covered Software of a particular Contributor. 17 | 18 | 1.4. "Covered Software" 19 | means Source Code Form to which the initial Contributor has attached 20 | the notice in Exhibit A, the Executable Form of such Source Code 21 | Form, and Modifications of such Source Code Form, in each case 22 | including portions thereof. 23 | 24 | 1.5. "Incompatible With Secondary Licenses" 25 | means 26 | 27 | (a) that the initial Contributor has attached the notice described 28 | in Exhibit B to the Covered Software; or 29 | 30 | (b) that the Covered Software was made available under the terms of 31 | version 1.1 or earlier of the License, but not also under the 32 | terms of a Secondary License. 33 | 34 | 1.6. "Executable Form" 35 | means any form of the work other than Source Code Form. 36 | 37 | 1.7. "Larger Work" 38 | means a work that combines Covered Software with other material, in 39 | a separate file or files, that is not Covered Software. 40 | 41 | 1.8. "License" 42 | means this document. 43 | 44 | 1.9. "Licensable" 45 | means having the right to grant, to the maximum extent possible, 46 | whether at the time of the initial grant or subsequently, any and 47 | all of the rights conveyed by this License. 48 | 49 | 1.10. "Modifications" 50 | means any of the following: 51 | 52 | (a) any file in Source Code Form that results from an addition to, 53 | deletion from, or modification of the contents of Covered 54 | Software; or 55 | 56 | (b) any new file in Source Code Form that contains any Covered 57 | Software. 58 | 59 | 1.11. "Patent Claims" of a Contributor 60 | means any patent claim(s), including without limitation, method, 61 | process, and apparatus claims, in any patent Licensable by such 62 | Contributor that would be infringed, but for the grant of the 63 | License, by the making, using, selling, offering for sale, having 64 | made, import, or transfer of either its Contributions or its 65 | Contributor Version. 66 | 67 | 1.12. "Secondary License" 68 | means either the GNU General Public License, Version 2.0, the GNU 69 | Lesser General Public License, Version 2.1, the GNU Affero General 70 | Public License, Version 3.0, or any later versions of those 71 | licenses. 72 | 73 | 1.13. "Source Code Form" 74 | means the form of the work preferred for making modifications. 75 | 76 | 1.14. "You" (or "Your") 77 | means an individual or a legal entity exercising rights under this 78 | License. For legal entities, "You" includes any entity that 79 | controls, is controlled by, or is under common control with You. For 80 | purposes of this definition, "control" means (a) the power, direct 81 | or indirect, to cause the direction or management of such entity, 82 | whether by contract or otherwise, or (b) ownership of more than 83 | fifty percent (50%) of the outstanding shares or beneficial 84 | ownership of such entity. 85 | 86 | 2. License Grants and Conditions 87 | -------------------------------- 88 | 89 | 2.1. Grants 90 | 91 | Each Contributor hereby grants You a world-wide, royalty-free, 92 | non-exclusive license: 93 | 94 | (a) under intellectual property rights (other than patent or trademark) 95 | Licensable by such Contributor to use, reproduce, make available, 96 | modify, display, perform, distribute, and otherwise exploit its 97 | Contributions, either on an unmodified basis, with Modifications, or 98 | as part of a Larger Work; and 99 | 100 | (b) under Patent Claims of such Contributor to make, use, sell, offer 101 | for sale, have made, import, and otherwise transfer either its 102 | Contributions or its Contributor Version. 103 | 104 | 2.2. Effective Date 105 | 106 | The licenses granted in Section 2.1 with respect to any Contribution 107 | become effective for each Contribution on the date the Contributor first 108 | distributes such Contribution. 109 | 110 | 2.3. Limitations on Grant Scope 111 | 112 | The licenses granted in this Section 2 are the only rights granted under 113 | this License. No additional rights or licenses will be implied from the 114 | distribution or licensing of Covered Software under this License. 115 | Notwithstanding Section 2.1(b) above, no patent license is granted by a 116 | Contributor: 117 | 118 | (a) for any code that a Contributor has removed from Covered Software; 119 | or 120 | 121 | (b) for infringements caused by: (i) Your and any other third party's 122 | modifications of Covered Software, or (ii) the combination of its 123 | Contributions with other software (except as part of its Contributor 124 | Version); or 125 | 126 | (c) under Patent Claims infringed by Covered Software in the absence of 127 | its Contributions. 128 | 129 | This License does not grant any rights in the trademarks, service marks, 130 | or logos of any Contributor (except as may be necessary to comply with 131 | the notice requirements in Section 3.4). 132 | 133 | 2.4. Subsequent Licenses 134 | 135 | No Contributor makes additional grants as a result of Your choice to 136 | distribute the Covered Software under a subsequent version of this 137 | License (see Section 10.2) or under the terms of a Secondary License (if 138 | permitted under the terms of Section 3.3). 139 | 140 | 2.5. Representation 141 | 142 | Each Contributor represents that the Contributor believes its 143 | Contributions are its original creation(s) or it has sufficient rights 144 | to grant the rights to its Contributions conveyed by this License. 145 | 146 | 2.6. Fair Use 147 | 148 | This License is not intended to limit any rights You have under 149 | applicable copyright doctrines of fair use, fair dealing, or other 150 | equivalents. 151 | 152 | 2.7. Conditions 153 | 154 | Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted 155 | in Section 2.1. 156 | 157 | 3. Responsibilities 158 | ------------------- 159 | 160 | 3.1. Distribution of Source Form 161 | 162 | All distribution of Covered Software in Source Code Form, including any 163 | Modifications that You create or to which You contribute, must be under 164 | the terms of this License. You must inform recipients that the Source 165 | Code Form of the Covered Software is governed by the terms of this 166 | License, and how they can obtain a copy of this License. You may not 167 | attempt to alter or restrict the recipients' rights in the Source Code 168 | Form. 169 | 170 | 3.2. Distribution of Executable Form 171 | 172 | If You distribute Covered Software in Executable Form then: 173 | 174 | (a) such Covered Software must also be made available in Source Code 175 | Form, as described in Section 3.1, and You must inform recipients of 176 | the Executable Form how they can obtain a copy of such Source Code 177 | Form by reasonable means in a timely manner, at a charge no more 178 | than the cost of distribution to the recipient; and 179 | 180 | (b) You may distribute such Executable Form under the terms of this 181 | License, or sublicense it under different terms, provided that the 182 | license for the Executable Form does not attempt to limit or alter 183 | the recipients' rights in the Source Code Form under this License. 184 | 185 | 3.3. Distribution of a Larger Work 186 | 187 | You may create and distribute a Larger Work under terms of Your choice, 188 | provided that You also comply with the requirements of this License for 189 | the Covered Software. If the Larger Work is a combination of Covered 190 | Software with a work governed by one or more Secondary Licenses, and the 191 | Covered Software is not Incompatible With Secondary Licenses, this 192 | License permits You to additionally distribute such Covered Software 193 | under the terms of such Secondary License(s), so that the recipient of 194 | the Larger Work may, at their option, further distribute the Covered 195 | Software under the terms of either this License or such Secondary 196 | License(s). 197 | 198 | 3.4. Notices 199 | 200 | You may not remove or alter the substance of any license notices 201 | (including copyright notices, patent notices, disclaimers of warranty, 202 | or limitations of liability) contained within the Source Code Form of 203 | the Covered Software, except that You may alter any license notices to 204 | the extent required to remedy known factual inaccuracies. 205 | 206 | 3.5. Application of Additional Terms 207 | 208 | You may choose to offer, and to charge a fee for, warranty, support, 209 | indemnity or liability obligations to one or more recipients of Covered 210 | Software. However, You may do so only on Your own behalf, and not on 211 | behalf of any Contributor. You must make it absolutely clear that any 212 | such warranty, support, indemnity, or liability obligation is offered by 213 | You alone, and You hereby agree to indemnify every Contributor for any 214 | liability incurred by such Contributor as a result of warranty, support, 215 | indemnity or liability terms You offer. You may include additional 216 | disclaimers of warranty and limitations of liability specific to any 217 | jurisdiction. 218 | 219 | 4. Inability to Comply Due to Statute or Regulation 220 | --------------------------------------------------- 221 | 222 | If it is impossible for You to comply with any of the terms of this 223 | License with respect to some or all of the Covered Software due to 224 | statute, judicial order, or regulation then You must: (a) comply with 225 | the terms of this License to the maximum extent possible; and (b) 226 | describe the limitations and the code they affect. Such description must 227 | be placed in a text file included with all distributions of the Covered 228 | Software under this License. Except to the extent prohibited by statute 229 | or regulation, such description must be sufficiently detailed for a 230 | recipient of ordinary skill to be able to understand it. 231 | 232 | 5. Termination 233 | -------------- 234 | 235 | 5.1. The rights granted under this License will terminate automatically 236 | if You fail to comply with any of its terms. However, if You become 237 | compliant, then the rights granted under this License from a particular 238 | Contributor are reinstated (a) provisionally, unless and until such 239 | Contributor explicitly and finally terminates Your grants, and (b) on an 240 | ongoing basis, if such Contributor fails to notify You of the 241 | non-compliance by some reasonable means prior to 60 days after You have 242 | come back into compliance. Moreover, Your grants from a particular 243 | Contributor are reinstated on an ongoing basis if such Contributor 244 | notifies You of the non-compliance by some reasonable means, this is the 245 | first time You have received notice of non-compliance with this License 246 | from such Contributor, and You become compliant prior to 30 days after 247 | Your receipt of the notice. 248 | 249 | 5.2. If You initiate litigation against any entity by asserting a patent 250 | infringement claim (excluding declaratory judgment actions, 251 | counter-claims, and cross-claims) alleging that a Contributor Version 252 | directly or indirectly infringes any patent, then the rights granted to 253 | You by any and all Contributors for the Covered Software under Section 254 | 2.1 of this License shall terminate. 255 | 256 | 5.3. In the event of termination under Sections 5.1 or 5.2 above, all 257 | end user license agreements (excluding distributors and resellers) which 258 | have been validly granted by You or Your distributors under this License 259 | prior to termination shall survive termination. 260 | 261 | ************************************************************************ 262 | * * 263 | * 6. Disclaimer of Warranty * 264 | * ------------------------- * 265 | * * 266 | * Covered Software is provided under this License on an "as is" * 267 | * basis, without warranty of any kind, either expressed, implied, or * 268 | * statutory, including, without limitation, warranties that the * 269 | * Covered Software is free of defects, merchantable, fit for a * 270 | * particular purpose or non-infringing. The entire risk as to the * 271 | * quality and performance of the Covered Software is with You. * 272 | * Should any Covered Software prove defective in any respect, You * 273 | * (not any Contributor) assume the cost of any necessary servicing, * 274 | * repair, or correction. This disclaimer of warranty constitutes an * 275 | * essential part of this License. No use of any Covered Software is * 276 | * authorized under this License except under this disclaimer. * 277 | * * 278 | ************************************************************************ 279 | 280 | ************************************************************************ 281 | * * 282 | * 7. Limitation of Liability * 283 | * -------------------------- * 284 | * * 285 | * Under no circumstances and under no legal theory, whether tort * 286 | * (including negligence), contract, or otherwise, shall any * 287 | * Contributor, or anyone who distributes Covered Software as * 288 | * permitted above, be liable to You for any direct, indirect, * 289 | * special, incidental, or consequential damages of any character * 290 | * including, without limitation, damages for lost profits, loss of * 291 | * goodwill, work stoppage, computer failure or malfunction, or any * 292 | * and all other commercial damages or losses, even if such party * 293 | * shall have been informed of the possibility of such damages. This * 294 | * limitation of liability shall not apply to liability for death or * 295 | * personal injury resulting from such party's negligence to the * 296 | * extent applicable law prohibits such limitation. Some * 297 | * jurisdictions do not allow the exclusion or limitation of * 298 | * incidental or consequential damages, so this exclusion and * 299 | * limitation may not apply to You. * 300 | * * 301 | ************************************************************************ 302 | 303 | 8. Litigation 304 | ------------- 305 | 306 | Any litigation relating to this License may be brought only in the 307 | courts of a jurisdiction where the defendant maintains its principal 308 | place of business and such litigation shall be governed by laws of that 309 | jurisdiction, without reference to its conflict-of-law provisions. 310 | Nothing in this Section shall prevent a party's ability to bring 311 | cross-claims or counter-claims. 312 | 313 | 9. Miscellaneous 314 | ---------------- 315 | 316 | This License represents the complete agreement concerning the subject 317 | matter hereof. If any provision of this License is held to be 318 | unenforceable, such provision shall be reformed only to the extent 319 | necessary to make it enforceable. Any law or regulation which provides 320 | that the language of a contract shall be construed against the drafter 321 | shall not be used to construe this License against a Contributor. 322 | 323 | 10. Versions of the License 324 | --------------------------- 325 | 326 | 10.1. New Versions 327 | 328 | Mozilla Foundation is the license steward. Except as provided in Section 329 | 10.3, no one other than the license steward has the right to modify or 330 | publish new versions of this License. Each version will be given a 331 | distinguishing version number. 332 | 333 | 10.2. Effect of New Versions 334 | 335 | You may distribute the Covered Software under the terms of the version 336 | of the License under which You originally received the Covered Software, 337 | or under the terms of any subsequent version published by the license 338 | steward. 339 | 340 | 10.3. Modified Versions 341 | 342 | If you create software not governed by this License, and you want to 343 | create a new license for such software, you may create and use a 344 | modified version of this License if you rename the license and remove 345 | any references to the name of the license steward (except to note that 346 | such modified license differs from this License). 347 | 348 | 10.4. Distributing Source Code Form that is Incompatible With Secondary 349 | Licenses 350 | 351 | If You choose to distribute Source Code Form that is Incompatible With 352 | Secondary Licenses under the terms of this version of the License, the 353 | notice described in Exhibit B of this License must be attached. 354 | 355 | Exhibit A - Source Code Form License Notice 356 | ------------------------------------------- 357 | 358 | This Source Code Form is subject to the terms of the Mozilla Public 359 | License, v. 2.0. If a copy of the MPL was not distributed with this 360 | file, You can obtain one at http://mozilla.org/MPL/2.0/. 361 | 362 | If it is not possible or desirable to put the notice in a particular 363 | file, then You may include the notice in a location (such as a LICENSE 364 | file in a relevant directory) where a recipient would be likely to look 365 | for such a notice. 366 | 367 | You may add additional accurate notices of copyright ownership. 368 | 369 | Exhibit B - "Incompatible With Secondary Licenses" Notice 370 | --------------------------------------------------------- 371 | 372 | This Source Code Form is "Incompatible With Secondary Licenses", as 373 | defined by the Mozilla Public License, v. 2.0. 374 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # MeshTiler 2 | 3 | Get a 3D mesh of any place in the world using [MapTiler](https://www.maptiler.com), based on 4 | [RGB Terrain](https://cloud.maptiler.com/tiles/terrain-rgb/) and 5 | [Satellite](https://cloud.maptiler.com/tiles/satellite/) tiles. 6 | 7 | This project has been created for the 8 | [#MyMapTiler contest](https://twitter.com/MapTiler/status/1166349855654105090). 9 | It is inspired by Vladimir Agafonkin's 10 | [MARTINI: Real-Time RTIN Terrain Mesh](https://observablehq.com/@mourner/martin-real-time-rtin-terrain-mesh) Observable notebook. 11 | 12 | Demo: **[Try it here!](https://mesh-tiler.karavia.ch)** 13 | 14 | [Screenshot](https://mesh-tiler.karavia.ch) 15 | 16 | See also: [MeshTiler CH](https://github.com/rkaravia/mesh-tiler-ch) – similar project using Swisstopo Open Data 17 | 18 | ## Install 19 | 20 | ``` 21 | npm install 22 | ``` 23 | 24 | ## Run 25 | 26 | You will need a key from [MapTiler](https://cloud.maptiler.com/account/keys). 27 | 28 | ``` 29 | MAPTILER_KEY= npm run dev 30 | ``` 31 | 32 | ## License 33 | 34 | This project is licensed under the MPL 2.0 license, see the LICENSE file. 35 | 36 | ## Acknowledgements 37 | 38 | The following open source libraries have made MeshTiler possible: 39 | 40 | - [MARTINI](https://github.com/mapbox/martini), © 2019 Mapbox, 41 | [ISC License](https://github.com/mapbox/martini/blob/master/LICENSE) 42 | - [Svelte](https://svelte.dev), © 2016-2021 Svelte contributors 43 | [MIT License](https://github.com/sveltejs/svelte/blob/master/LICENSE) 44 | - [Leaflet](https://leafletjs.com), © 2010-2011 CloudMade, © 2010-2021 Vladimir Agafonkin, 45 | [BSD 2-Clause License](https://github.com/Leaflet/Leaflet/blob/master/LICENSE) 46 | - [three.js](https://threejs.org), © 2010-2021 three.js authors, 47 | [MIT License](https://github.com/mrdoob/three.js/blob/master/LICENSE) 48 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "mesh-tiler", 3 | "version": "1.0.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "@babel/code-frame": { 8 | "version": "7.12.13", 9 | "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", 10 | "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", 11 | "dev": true, 12 | "requires": { 13 | "@babel/highlight": "^7.12.13" 14 | } 15 | }, 16 | "@babel/helper-validator-identifier": { 17 | "version": "7.12.11", 18 | "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", 19 | "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", 20 | "dev": true 21 | }, 22 | "@babel/highlight": { 23 | "version": "7.13.8", 24 | "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.13.8.tgz", 25 | "integrity": "sha512-4vrIhfJyfNf+lCtXC2ck1rKSzDwciqF7IWFhXXrSOUC2O5DrVp+w4c6ed4AllTxhTkUP5x2tYj41VaxdVMMRDw==", 26 | "dev": true, 27 | "requires": { 28 | "@babel/helper-validator-identifier": "^7.12.11", 29 | "chalk": "^2.0.0", 30 | "js-tokens": "^4.0.0" 31 | } 32 | }, 33 | "@mapbox/martini": { 34 | "version": "0.2.0", 35 | "resolved": "https://registry.npmjs.org/@mapbox/martini/-/martini-0.2.0.tgz", 36 | "integrity": "sha512-7hFhtkb0KTLEls+TRw/rWayq5EeHtTaErgm/NskVoXmtgAQu/9D299aeyj6mzAR/6XUnYRp2lU+4IcrYRFjVsQ==" 37 | }, 38 | "@nodelib/fs.scandir": { 39 | "version": "2.1.4", 40 | "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.4.tgz", 41 | "integrity": "sha512-33g3pMJk3bg5nXbL/+CY6I2eJDzZAni49PfJnL5fghPTggPvBd/pFNSgJsdAgWptuFu7qq/ERvOYFlhvsLTCKA==", 42 | "dev": true, 43 | "requires": { 44 | "@nodelib/fs.stat": "2.0.4", 45 | "run-parallel": "^1.1.9" 46 | } 47 | }, 48 | "@nodelib/fs.stat": { 49 | "version": "2.0.4", 50 | "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.4.tgz", 51 | "integrity": "sha512-IYlHJA0clt2+Vg7bccq+TzRdJvv19c2INqBSsoOLp1je7xjtr7J26+WXR72MCdvU9q1qTzIWDfhMf+DRvQJK4Q==", 52 | "dev": true 53 | }, 54 | "@nodelib/fs.walk": { 55 | "version": "1.2.6", 56 | "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.6.tgz", 57 | "integrity": "sha512-8Broas6vTtW4GIXTAHDoE32hnN2M5ykgCpWGbuXHQ15vEMqr23pB76e/GZcYsZCHALv50ktd24qhEyKr6wBtow==", 58 | "dev": true, 59 | "requires": { 60 | "@nodelib/fs.scandir": "2.1.4", 61 | "fastq": "^1.6.0" 62 | } 63 | }, 64 | "@polka/url": { 65 | "version": "1.0.0-next.11", 66 | "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.11.tgz", 67 | "integrity": "sha512-3NsZsJIA/22P3QUyrEDNA2D133H4j224twJrdipXN38dpnIOzAbUDtOwkcJ5pXmn75w7LSQDjA4tO9dm1XlqlA==" 68 | }, 69 | "@rkaravia/static-map": { 70 | "version": "0.2.2", 71 | "resolved": "https://registry.npmjs.org/@rkaravia/static-map/-/static-map-0.2.2.tgz", 72 | "integrity": "sha512-Fw2E7trnOww7gpXeESf1GEEsD6IrR4c19RyzvWXmfuS8K+vMe8Ri9Oz03xNJLIv20O0BBsXp/L+ty+XzSIkoLg==", 73 | "requires": { 74 | "async.queue": "^0.5.2", 75 | "limiter": "^1.1.3" 76 | } 77 | }, 78 | "@rollup/pluginutils": { 79 | "version": "4.1.0", 80 | "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-4.1.0.tgz", 81 | "integrity": "sha512-TrBhfJkFxA+ER+ew2U2/fHbebhLT/l/2pRk0hfj9KusXUuRXd2v0R58AfaZK9VXDQ4TogOSEmICVrQAA3zFnHQ==", 82 | "dev": true, 83 | "requires": { 84 | "estree-walker": "^2.0.1", 85 | "picomatch": "^2.2.2" 86 | }, 87 | "dependencies": { 88 | "estree-walker": { 89 | "version": "2.0.2", 90 | "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", 91 | "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", 92 | "dev": true 93 | } 94 | } 95 | }, 96 | "@types/estree": { 97 | "version": "0.0.39", 98 | "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", 99 | "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==", 100 | "dev": true 101 | }, 102 | "@types/fs-extra": { 103 | "version": "8.1.1", 104 | "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-8.1.1.tgz", 105 | "integrity": "sha512-TcUlBem321DFQzBNuz8p0CLLKp0VvF/XH9E4KHNmgwyp4E3AfgI5cjiIVZWlbfThBop2qxFIh4+LeY6hVWWZ2w==", 106 | "dev": true, 107 | "requires": { 108 | "@types/node": "*" 109 | } 110 | }, 111 | "@types/glob": { 112 | "version": "7.1.3", 113 | "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.3.tgz", 114 | "integrity": "sha512-SEYeGAIQIQX8NN6LDKprLjbrd5dARM5EXsd8GI/A5l0apYI1fGMWgPHSe4ZKL4eozlAyI+doUE9XbYS4xCkQ1w==", 115 | "dev": true, 116 | "requires": { 117 | "@types/minimatch": "*", 118 | "@types/node": "*" 119 | } 120 | }, 121 | "@types/minimatch": { 122 | "version": "3.0.3", 123 | "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", 124 | "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==", 125 | "dev": true 126 | }, 127 | "@types/node": { 128 | "version": "12.7.5", 129 | "resolved": "https://registry.npmjs.org/@types/node/-/node-12.7.5.tgz", 130 | "integrity": "sha512-9fq4jZVhPNW8r+UYKnxF1e2HkDWOWKM5bC2/7c9wPV835I0aOrVbS/Hw/pWPk2uKrNXQqg9Z959Kz+IYDd5p3w==", 131 | "dev": true 132 | }, 133 | "@types/resolve": { 134 | "version": "0.0.8", 135 | "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-0.0.8.tgz", 136 | "integrity": "sha512-auApPaJf3NPfe18hSoJkp8EbZzer2ISk7o8mCC3M9he/a04+gbMF97NkpD2S8riMGvm4BMRI59/SZQSaLTKpsQ==", 137 | "dev": true, 138 | "requires": { 139 | "@types/node": "*" 140 | } 141 | }, 142 | "ansi-styles": { 143 | "version": "3.2.1", 144 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 145 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 146 | "dev": true, 147 | "requires": { 148 | "color-convert": "^1.9.0" 149 | } 150 | }, 151 | "anymatch": { 152 | "version": "3.1.1", 153 | "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", 154 | "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", 155 | "dev": true, 156 | "requires": { 157 | "normalize-path": "^3.0.0", 158 | "picomatch": "^2.0.4" 159 | } 160 | }, 161 | "array-union": { 162 | "version": "2.1.0", 163 | "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", 164 | "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", 165 | "dev": true 166 | }, 167 | "async-limiter": { 168 | "version": "1.0.1", 169 | "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", 170 | "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", 171 | "dev": true 172 | }, 173 | "async.queue": { 174 | "version": "0.5.2", 175 | "resolved": "https://registry.npmjs.org/async.queue/-/async.queue-0.5.2.tgz", 176 | "integrity": "sha1-jV2QgS4UgQZrwJBOjMFxKxfDvXw=", 177 | "requires": { 178 | "async.util.queue": "0.5.2" 179 | } 180 | }, 181 | "async.util.arrayeach": { 182 | "version": "0.5.2", 183 | "resolved": "https://registry.npmjs.org/async.util.arrayeach/-/async.util.arrayeach-0.5.2.tgz", 184 | "integrity": "sha1-WMTpgCjVXWm/sFrrOvROClVagpw=" 185 | }, 186 | "async.util.isarray": { 187 | "version": "0.5.2", 188 | "resolved": "https://registry.npmjs.org/async.util.isarray/-/async.util.isarray-0.5.2.tgz", 189 | "integrity": "sha1-5i2sjyY29lh13PdSHC0k0N+yu98=" 190 | }, 191 | "async.util.map": { 192 | "version": "0.5.2", 193 | "resolved": "https://registry.npmjs.org/async.util.map/-/async.util.map-0.5.2.tgz", 194 | "integrity": "sha1-5YjvhuCzq18CfZevTWg10FXKadY=" 195 | }, 196 | "async.util.noop": { 197 | "version": "0.5.2", 198 | "resolved": "https://registry.npmjs.org/async.util.noop/-/async.util.noop-0.5.2.tgz", 199 | "integrity": "sha1-vdYrl8sKo/YLWGrRSEaGmJdeWLk=" 200 | }, 201 | "async.util.onlyonce": { 202 | "version": "0.5.2", 203 | "resolved": "https://registry.npmjs.org/async.util.onlyonce/-/async.util.onlyonce-0.5.2.tgz", 204 | "integrity": "sha1-uOb8AErckjFk154y8oE+5GXCT/I=" 205 | }, 206 | "async.util.queue": { 207 | "version": "0.5.2", 208 | "resolved": "https://registry.npmjs.org/async.util.queue/-/async.util.queue-0.5.2.tgz", 209 | "integrity": "sha1-V/Zavho83yc9MavSirlUJfgiLuU=", 210 | "requires": { 211 | "async.util.arrayeach": "0.5.2", 212 | "async.util.isarray": "0.5.2", 213 | "async.util.map": "0.5.2", 214 | "async.util.noop": "0.5.2", 215 | "async.util.onlyonce": "0.5.2", 216 | "async.util.setimmediate": "0.5.2" 217 | } 218 | }, 219 | "async.util.setimmediate": { 220 | "version": "0.5.2", 221 | "resolved": "https://registry.npmjs.org/async.util.setimmediate/-/async.util.setimmediate-0.5.2.tgz", 222 | "integrity": "sha1-KBLrq/KlgCd1jUvHeT0cz68QJV8=" 223 | }, 224 | "balanced-match": { 225 | "version": "1.0.0", 226 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", 227 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", 228 | "dev": true 229 | }, 230 | "binary-extensions": { 231 | "version": "2.2.0", 232 | "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", 233 | "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", 234 | "dev": true 235 | }, 236 | "brace-expansion": { 237 | "version": "1.1.11", 238 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 239 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 240 | "dev": true, 241 | "requires": { 242 | "balanced-match": "^1.0.0", 243 | "concat-map": "0.0.1" 244 | } 245 | }, 246 | "braces": { 247 | "version": "3.0.2", 248 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", 249 | "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", 250 | "dev": true, 251 | "requires": { 252 | "fill-range": "^7.0.1" 253 | } 254 | }, 255 | "buffer-from": { 256 | "version": "1.1.1", 257 | "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", 258 | "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", 259 | "dev": true 260 | }, 261 | "builtin-modules": { 262 | "version": "3.1.0", 263 | "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.1.0.tgz", 264 | "integrity": "sha512-k0KL0aWZuBt2lrxrcASWDfwOLMnodeQjodT/1SxEQAXsHANgo6ZC/VEaSEHCXt7aSTZ4/4H5LKa+tBXmW7Vtvw==", 265 | "dev": true 266 | }, 267 | "chalk": { 268 | "version": "2.4.2", 269 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", 270 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", 271 | "dev": true, 272 | "requires": { 273 | "ansi-styles": "^3.2.1", 274 | "escape-string-regexp": "^1.0.5", 275 | "supports-color": "^5.3.0" 276 | } 277 | }, 278 | "chokidar": { 279 | "version": "3.5.1", 280 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz", 281 | "integrity": "sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==", 282 | "dev": true, 283 | "requires": { 284 | "anymatch": "~3.1.1", 285 | "braces": "~3.0.2", 286 | "fsevents": "~2.3.1", 287 | "glob-parent": "~5.1.0", 288 | "is-binary-path": "~2.1.0", 289 | "is-glob": "~4.0.1", 290 | "normalize-path": "~3.0.0", 291 | "readdirp": "~3.5.0" 292 | } 293 | }, 294 | "color-convert": { 295 | "version": "1.9.3", 296 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 297 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 298 | "dev": true, 299 | "requires": { 300 | "color-name": "1.1.3" 301 | } 302 | }, 303 | "color-name": { 304 | "version": "1.1.3", 305 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 306 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", 307 | "dev": true 308 | }, 309 | "colorette": { 310 | "version": "1.2.2", 311 | "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz", 312 | "integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==", 313 | "dev": true 314 | }, 315 | "commander": { 316 | "version": "2.20.3", 317 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", 318 | "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", 319 | "dev": true 320 | }, 321 | "concat-map": { 322 | "version": "0.0.1", 323 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 324 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", 325 | "dev": true 326 | }, 327 | "console-clear": { 328 | "version": "1.1.1", 329 | "resolved": "https://registry.npmjs.org/console-clear/-/console-clear-1.1.1.tgz", 330 | "integrity": "sha512-pMD+MVR538ipqkG5JXeOEbKWS5um1H4LUUccUQG68qpeqBYbzYy79Gh55jkd2TtPdRfUaLWdv6LPP//5Zt0aPQ==" 331 | }, 332 | "cross-spawn": { 333 | "version": "6.0.5", 334 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", 335 | "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", 336 | "dev": true, 337 | "requires": { 338 | "nice-try": "^1.0.4", 339 | "path-key": "^2.0.1", 340 | "semver": "^5.5.0", 341 | "shebang-command": "^1.2.0", 342 | "which": "^1.2.9" 343 | } 344 | }, 345 | "define-properties": { 346 | "version": "1.1.3", 347 | "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", 348 | "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", 349 | "dev": true, 350 | "requires": { 351 | "object-keys": "^1.0.12" 352 | } 353 | }, 354 | "dir-glob": { 355 | "version": "3.0.1", 356 | "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", 357 | "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", 358 | "dev": true, 359 | "requires": { 360 | "path-type": "^4.0.0" 361 | }, 362 | "dependencies": { 363 | "path-type": { 364 | "version": "4.0.0", 365 | "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", 366 | "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", 367 | "dev": true 368 | } 369 | } 370 | }, 371 | "error-ex": { 372 | "version": "1.3.2", 373 | "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", 374 | "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", 375 | "dev": true, 376 | "requires": { 377 | "is-arrayish": "^0.2.1" 378 | } 379 | }, 380 | "es-abstract": { 381 | "version": "1.14.2", 382 | "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.14.2.tgz", 383 | "integrity": "sha512-DgoQmbpFNOofkjJtKwr87Ma5EW4Dc8fWhD0R+ndq7Oc456ivUfGOOP6oAZTTKl5/CcNMP+EN+e3/iUzgE0veZg==", 384 | "dev": true, 385 | "requires": { 386 | "es-to-primitive": "^1.2.0", 387 | "function-bind": "^1.1.1", 388 | "has": "^1.0.3", 389 | "has-symbols": "^1.0.0", 390 | "is-callable": "^1.1.4", 391 | "is-regex": "^1.0.4", 392 | "object-inspect": "^1.6.0", 393 | "object-keys": "^1.1.1", 394 | "string.prototype.trimleft": "^2.0.0", 395 | "string.prototype.trimright": "^2.0.0" 396 | } 397 | }, 398 | "es-to-primitive": { 399 | "version": "1.2.0", 400 | "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.0.tgz", 401 | "integrity": "sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg==", 402 | "dev": true, 403 | "requires": { 404 | "is-callable": "^1.1.4", 405 | "is-date-object": "^1.0.1", 406 | "is-symbol": "^1.0.2" 407 | } 408 | }, 409 | "escape-string-regexp": { 410 | "version": "1.0.5", 411 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 412 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", 413 | "dev": true 414 | }, 415 | "estree-walker": { 416 | "version": "0.6.1", 417 | "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.1.tgz", 418 | "integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==", 419 | "dev": true 420 | }, 421 | "fast-glob": { 422 | "version": "3.2.5", 423 | "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.5.tgz", 424 | "integrity": "sha512-2DtFcgT68wiTTiwZ2hNdJfcHNke9XOfnwmBRWXhmeKM8rF0TGwmC/Qto3S7RoZKp5cilZbxzO5iTNTQsJ+EeDg==", 425 | "dev": true, 426 | "requires": { 427 | "@nodelib/fs.stat": "^2.0.2", 428 | "@nodelib/fs.walk": "^1.2.3", 429 | "glob-parent": "^5.1.0", 430 | "merge2": "^1.3.0", 431 | "micromatch": "^4.0.2", 432 | "picomatch": "^2.2.1" 433 | } 434 | }, 435 | "fastq": { 436 | "version": "1.11.0", 437 | "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.11.0.tgz", 438 | "integrity": "sha512-7Eczs8gIPDrVzT+EksYBcupqMyxSHXXrHOLRRxU2/DicV8789MRBRR8+Hc2uWzUupOs4YS4JzBmBxjjCVBxD/g==", 439 | "dev": true, 440 | "requires": { 441 | "reusify": "^1.0.4" 442 | } 443 | }, 444 | "fill-range": { 445 | "version": "7.0.1", 446 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", 447 | "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", 448 | "dev": true, 449 | "requires": { 450 | "to-regex-range": "^5.0.1" 451 | } 452 | }, 453 | "fs-extra": { 454 | "version": "8.1.0", 455 | "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", 456 | "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", 457 | "dev": true, 458 | "requires": { 459 | "graceful-fs": "^4.2.0", 460 | "jsonfile": "^4.0.0", 461 | "universalify": "^0.1.0" 462 | } 463 | }, 464 | "fs.realpath": { 465 | "version": "1.0.0", 466 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 467 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", 468 | "dev": true 469 | }, 470 | "fsevents": { 471 | "version": "2.3.2", 472 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", 473 | "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", 474 | "dev": true, 475 | "optional": true 476 | }, 477 | "function-bind": { 478 | "version": "1.1.1", 479 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 480 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", 481 | "dev": true 482 | }, 483 | "get-port": { 484 | "version": "3.2.0", 485 | "resolved": "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz", 486 | "integrity": "sha1-3Xzn3hh8Bsi/NTeWrHHgmfCYDrw=" 487 | }, 488 | "glob": { 489 | "version": "7.1.6", 490 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", 491 | "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", 492 | "dev": true, 493 | "requires": { 494 | "fs.realpath": "^1.0.0", 495 | "inflight": "^1.0.4", 496 | "inherits": "2", 497 | "minimatch": "^3.0.4", 498 | "once": "^1.3.0", 499 | "path-is-absolute": "^1.0.0" 500 | } 501 | }, 502 | "glob-parent": { 503 | "version": "5.1.1", 504 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", 505 | "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", 506 | "dev": true, 507 | "requires": { 508 | "is-glob": "^4.0.1" 509 | } 510 | }, 511 | "globby": { 512 | "version": "10.0.1", 513 | "resolved": "https://registry.npmjs.org/globby/-/globby-10.0.1.tgz", 514 | "integrity": "sha512-sSs4inE1FB2YQiymcmTv6NWENryABjUNPeWhOvmn4SjtKybglsyPZxFB3U1/+L1bYi0rNZDqCLlHyLYDl1Pq5A==", 515 | "dev": true, 516 | "requires": { 517 | "@types/glob": "^7.1.1", 518 | "array-union": "^2.1.0", 519 | "dir-glob": "^3.0.1", 520 | "fast-glob": "^3.0.3", 521 | "glob": "^7.1.3", 522 | "ignore": "^5.1.1", 523 | "merge2": "^1.2.3", 524 | "slash": "^3.0.0" 525 | } 526 | }, 527 | "graceful-fs": { 528 | "version": "4.2.2", 529 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.2.tgz", 530 | "integrity": "sha512-IItsdsea19BoLC7ELy13q1iJFNmd7ofZH5+X/pJr90/nRoPEX0DJo1dHDbgtYWOhJhcCgMDTOw84RZ72q6lB+Q==", 531 | "dev": true 532 | }, 533 | "has": { 534 | "version": "1.0.3", 535 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 536 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 537 | "dev": true, 538 | "requires": { 539 | "function-bind": "^1.1.1" 540 | } 541 | }, 542 | "has-flag": { 543 | "version": "3.0.0", 544 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 545 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", 546 | "dev": true 547 | }, 548 | "has-symbols": { 549 | "version": "1.0.0", 550 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", 551 | "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=", 552 | "dev": true 553 | }, 554 | "hosted-git-info": { 555 | "version": "2.8.4", 556 | "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.4.tgz", 557 | "integrity": "sha512-pzXIvANXEFrc5oFFXRMkbLPQ2rXRoDERwDLyrcUxGhaZhgP54BBSl9Oheh7Vv0T090cszWBxPjkQQ5Sq1PbBRQ==", 558 | "dev": true 559 | }, 560 | "ignore": { 561 | "version": "5.1.8", 562 | "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", 563 | "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", 564 | "dev": true 565 | }, 566 | "inflight": { 567 | "version": "1.0.6", 568 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 569 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 570 | "dev": true, 571 | "requires": { 572 | "once": "^1.3.0", 573 | "wrappy": "1" 574 | } 575 | }, 576 | "inherits": { 577 | "version": "2.0.4", 578 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 579 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", 580 | "dev": true 581 | }, 582 | "is-arrayish": { 583 | "version": "0.2.1", 584 | "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", 585 | "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", 586 | "dev": true 587 | }, 588 | "is-binary-path": { 589 | "version": "2.1.0", 590 | "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", 591 | "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", 592 | "dev": true, 593 | "requires": { 594 | "binary-extensions": "^2.0.0" 595 | } 596 | }, 597 | "is-callable": { 598 | "version": "1.1.4", 599 | "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", 600 | "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==", 601 | "dev": true 602 | }, 603 | "is-date-object": { 604 | "version": "1.0.1", 605 | "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", 606 | "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=", 607 | "dev": true 608 | }, 609 | "is-extglob": { 610 | "version": "2.1.1", 611 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 612 | "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", 613 | "dev": true 614 | }, 615 | "is-glob": { 616 | "version": "4.0.1", 617 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", 618 | "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", 619 | "dev": true, 620 | "requires": { 621 | "is-extglob": "^2.1.1" 622 | } 623 | }, 624 | "is-module": { 625 | "version": "1.0.0", 626 | "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", 627 | "integrity": "sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE=", 628 | "dev": true 629 | }, 630 | "is-number": { 631 | "version": "7.0.0", 632 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", 633 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", 634 | "dev": true 635 | }, 636 | "is-plain-object": { 637 | "version": "3.0.1", 638 | "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-3.0.1.tgz", 639 | "integrity": "sha512-Xnpx182SBMrr/aBik8y+GuR4U1L9FqMSojwDQwPMmxyC6bvEqly9UBCxhauBF5vNh2gwWJNX6oDV7O+OM4z34g==", 640 | "dev": true 641 | }, 642 | "is-reference": { 643 | "version": "1.1.3", 644 | "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.1.3.tgz", 645 | "integrity": "sha512-W1iHHv/oyBb2pPxkBxtaewxa1BC58Pn5J0hogyCdefwUIvb6R+TGbAcIa4qPNYLqLhb3EnOgUf2MQkkF76BcKw==", 646 | "dev": true, 647 | "requires": { 648 | "@types/estree": "0.0.39" 649 | } 650 | }, 651 | "is-regex": { 652 | "version": "1.0.4", 653 | "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", 654 | "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", 655 | "dev": true, 656 | "requires": { 657 | "has": "^1.0.1" 658 | } 659 | }, 660 | "is-symbol": { 661 | "version": "1.0.2", 662 | "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz", 663 | "integrity": "sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==", 664 | "dev": true, 665 | "requires": { 666 | "has-symbols": "^1.0.0" 667 | } 668 | }, 669 | "isexe": { 670 | "version": "2.0.0", 671 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 672 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", 673 | "dev": true 674 | }, 675 | "jest-worker": { 676 | "version": "26.6.2", 677 | "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", 678 | "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", 679 | "dev": true, 680 | "requires": { 681 | "@types/node": "*", 682 | "merge-stream": "^2.0.0", 683 | "supports-color": "^7.0.0" 684 | }, 685 | "dependencies": { 686 | "has-flag": { 687 | "version": "4.0.0", 688 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 689 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", 690 | "dev": true 691 | }, 692 | "supports-color": { 693 | "version": "7.2.0", 694 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", 695 | "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", 696 | "dev": true, 697 | "requires": { 698 | "has-flag": "^4.0.0" 699 | } 700 | } 701 | } 702 | }, 703 | "js-tokens": { 704 | "version": "4.0.0", 705 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", 706 | "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", 707 | "dev": true 708 | }, 709 | "json-parse-better-errors": { 710 | "version": "1.0.2", 711 | "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", 712 | "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", 713 | "dev": true 714 | }, 715 | "jsonfile": { 716 | "version": "4.0.0", 717 | "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", 718 | "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", 719 | "dev": true, 720 | "requires": { 721 | "graceful-fs": "^4.1.6" 722 | } 723 | }, 724 | "kleur": { 725 | "version": "3.0.3", 726 | "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", 727 | "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==" 728 | }, 729 | "leaflet": { 730 | "version": "1.7.1", 731 | "resolved": "https://registry.npmjs.org/leaflet/-/leaflet-1.7.1.tgz", 732 | "integrity": "sha512-/xwPEBidtg69Q3HlqPdU3DnrXQOvQU/CCHA1tcDQVzOwm91YMYaILjNp7L4Eaw5Z4sOYdbBz6koWyibppd8Zqw==" 733 | }, 734 | "limiter": { 735 | "version": "1.1.4", 736 | "resolved": "https://registry.npmjs.org/limiter/-/limiter-1.1.4.tgz", 737 | "integrity": "sha512-XCpr5bElgDI65vVgstP8TWjv6/QKWm9GU5UG0Pr5sLQ3QLo8NVKsioe+Jed5/3vFOe3IQuqE7DKwTvKQkjTHvg==" 738 | }, 739 | "livereload": { 740 | "version": "0.9.1", 741 | "resolved": "https://registry.npmjs.org/livereload/-/livereload-0.9.1.tgz", 742 | "integrity": "sha512-9g7sua11kkyZNo2hLRCG3LuZZwqexoyEyecSlV8cAsfAVVCZqLzVir6XDqmH0r+Vzgnd5LrdHDMyjtFnJQLAYw==", 743 | "dev": true, 744 | "requires": { 745 | "chokidar": "^3.3.0", 746 | "livereload-js": "^3.1.0", 747 | "opts": ">= 1.2.0", 748 | "ws": "^6.2.1" 749 | } 750 | }, 751 | "livereload-js": { 752 | "version": "3.3.1", 753 | "resolved": "https://registry.npmjs.org/livereload-js/-/livereload-js-3.3.1.tgz", 754 | "integrity": "sha512-CBu1gTEfzVhlOK1WASKAAJ9Qx1fHECTq0SUB67sfxwQssopTyvzqTlgl+c0h9pZ6V+Fzd2rc510ppuNusg9teQ==", 755 | "dev": true 756 | }, 757 | "load-json-file": { 758 | "version": "4.0.0", 759 | "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", 760 | "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", 761 | "dev": true, 762 | "requires": { 763 | "graceful-fs": "^4.1.2", 764 | "parse-json": "^4.0.0", 765 | "pify": "^3.0.0", 766 | "strip-bom": "^3.0.0" 767 | } 768 | }, 769 | "local-access": { 770 | "version": "1.1.0", 771 | "resolved": "https://registry.npmjs.org/local-access/-/local-access-1.1.0.tgz", 772 | "integrity": "sha512-XfegD5pyTAfb+GY6chk283Ox5z8WexG56OvM06RWLpAc/UHozO8X6xAxEkIitZOtsSMM1Yr3DkHgW5W+onLhCw==" 773 | }, 774 | "magic-string": { 775 | "version": "0.25.3", 776 | "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.3.tgz", 777 | "integrity": "sha512-6QK0OpF/phMz0Q2AxILkX2mFhi7m+WMwTRg0LQKq/WBB0cDP4rYH3Wp4/d3OTXlrPLVJT/RFqj8tFeAR4nk8AA==", 778 | "dev": true, 779 | "requires": { 780 | "sourcemap-codec": "^1.4.4" 781 | } 782 | }, 783 | "memorystream": { 784 | "version": "0.3.1", 785 | "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", 786 | "integrity": "sha1-htcJCzDORV1j+64S3aUaR93K+bI=", 787 | "dev": true 788 | }, 789 | "merge-stream": { 790 | "version": "2.0.0", 791 | "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", 792 | "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", 793 | "dev": true 794 | }, 795 | "merge2": { 796 | "version": "1.4.1", 797 | "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", 798 | "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", 799 | "dev": true 800 | }, 801 | "micromatch": { 802 | "version": "4.0.2", 803 | "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", 804 | "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", 805 | "dev": true, 806 | "requires": { 807 | "braces": "^3.0.1", 808 | "picomatch": "^2.0.5" 809 | } 810 | }, 811 | "mime": { 812 | "version": "2.5.2", 813 | "resolved": "https://registry.npmjs.org/mime/-/mime-2.5.2.tgz", 814 | "integrity": "sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg==" 815 | }, 816 | "minimatch": { 817 | "version": "3.0.4", 818 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 819 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 820 | "dev": true, 821 | "requires": { 822 | "brace-expansion": "^1.1.7" 823 | } 824 | }, 825 | "mri": { 826 | "version": "1.1.6", 827 | "resolved": "https://registry.npmjs.org/mri/-/mri-1.1.6.tgz", 828 | "integrity": "sha512-oi1b3MfbyGa7FJMP9GmLTttni5JoICpYBRlq+x5V16fZbLsnL9N3wFqqIm/nIG43FjUFkFh9Epzp/kzUGUnJxQ==" 829 | }, 830 | "nice-try": { 831 | "version": "1.0.5", 832 | "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", 833 | "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", 834 | "dev": true 835 | }, 836 | "normalize-package-data": { 837 | "version": "2.5.0", 838 | "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", 839 | "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", 840 | "dev": true, 841 | "requires": { 842 | "hosted-git-info": "^2.1.4", 843 | "resolve": "^1.10.0", 844 | "semver": "2 || 3 || 4 || 5", 845 | "validate-npm-package-license": "^3.0.1" 846 | } 847 | }, 848 | "normalize-path": { 849 | "version": "3.0.0", 850 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", 851 | "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", 852 | "dev": true 853 | }, 854 | "npm-run-all": { 855 | "version": "4.1.5", 856 | "resolved": "https://registry.npmjs.org/npm-run-all/-/npm-run-all-4.1.5.tgz", 857 | "integrity": "sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ==", 858 | "dev": true, 859 | "requires": { 860 | "ansi-styles": "^3.2.1", 861 | "chalk": "^2.4.1", 862 | "cross-spawn": "^6.0.5", 863 | "memorystream": "^0.3.1", 864 | "minimatch": "^3.0.4", 865 | "pidtree": "^0.3.0", 866 | "read-pkg": "^3.0.0", 867 | "shell-quote": "^1.6.1", 868 | "string.prototype.padend": "^3.0.0" 869 | } 870 | }, 871 | "object-inspect": { 872 | "version": "1.6.0", 873 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.6.0.tgz", 874 | "integrity": "sha512-GJzfBZ6DgDAmnuaM3104jR4s1Myxr3Y3zfIyN4z3UdqN69oSRacNK8UhnobDdC+7J2AHCjGwxQubNJfE70SXXQ==", 875 | "dev": true 876 | }, 877 | "object-keys": { 878 | "version": "1.1.1", 879 | "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", 880 | "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", 881 | "dev": true 882 | }, 883 | "once": { 884 | "version": "1.4.0", 885 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 886 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 887 | "dev": true, 888 | "requires": { 889 | "wrappy": "1" 890 | } 891 | }, 892 | "opts": { 893 | "version": "2.0.2", 894 | "resolved": "https://registry.npmjs.org/opts/-/opts-2.0.2.tgz", 895 | "integrity": "sha512-k41FwbcLnlgnFh69f4qdUfvDQ+5vaSDnVPFI/y5XuhKRq97EnVVneO9F1ESVCdiVu4fCS2L8usX3mU331hB7pg==", 896 | "dev": true 897 | }, 898 | "parse-json": { 899 | "version": "4.0.0", 900 | "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", 901 | "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", 902 | "dev": true, 903 | "requires": { 904 | "error-ex": "^1.3.1", 905 | "json-parse-better-errors": "^1.0.1" 906 | } 907 | }, 908 | "path-is-absolute": { 909 | "version": "1.0.1", 910 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 911 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", 912 | "dev": true 913 | }, 914 | "path-key": { 915 | "version": "2.0.1", 916 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", 917 | "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", 918 | "dev": true 919 | }, 920 | "path-parse": { 921 | "version": "1.0.6", 922 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", 923 | "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", 924 | "dev": true 925 | }, 926 | "path-type": { 927 | "version": "3.0.0", 928 | "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", 929 | "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", 930 | "dev": true, 931 | "requires": { 932 | "pify": "^3.0.0" 933 | } 934 | }, 935 | "picomatch": { 936 | "version": "2.2.2", 937 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", 938 | "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", 939 | "dev": true 940 | }, 941 | "pidtree": { 942 | "version": "0.3.0", 943 | "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.3.0.tgz", 944 | "integrity": "sha512-9CT4NFlDcosssyg8KVFltgokyKZIFjoBxw8CTGy+5F38Y1eQWrt8tRayiUOXE+zVKQnYu5BR8JjCtvK3BcnBhg==", 945 | "dev": true 946 | }, 947 | "pify": { 948 | "version": "3.0.0", 949 | "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", 950 | "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", 951 | "dev": true 952 | }, 953 | "queue-microtask": { 954 | "version": "1.2.2", 955 | "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.2.tgz", 956 | "integrity": "sha512-dB15eXv3p2jDlbOiNLyMabYg1/sXvppd8DP2J3EOCQ0AkuSXCW2tP7mnVouVLJKgUMY6yP0kcQDVpLCN13h4Xg==", 957 | "dev": true 958 | }, 959 | "randombytes": { 960 | "version": "2.1.0", 961 | "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", 962 | "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", 963 | "dev": true, 964 | "requires": { 965 | "safe-buffer": "^5.1.0" 966 | } 967 | }, 968 | "read-pkg": { 969 | "version": "3.0.0", 970 | "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", 971 | "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", 972 | "dev": true, 973 | "requires": { 974 | "load-json-file": "^4.0.0", 975 | "normalize-package-data": "^2.3.2", 976 | "path-type": "^3.0.0" 977 | } 978 | }, 979 | "readdirp": { 980 | "version": "3.5.0", 981 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", 982 | "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", 983 | "dev": true, 984 | "requires": { 985 | "picomatch": "^2.2.1" 986 | } 987 | }, 988 | "require-relative": { 989 | "version": "0.8.7", 990 | "resolved": "https://registry.npmjs.org/require-relative/-/require-relative-0.8.7.tgz", 991 | "integrity": "sha1-eZlTn8ngR6N5KPoZb44VY9q9Nt4=", 992 | "dev": true 993 | }, 994 | "resolve": { 995 | "version": "1.12.0", 996 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.12.0.tgz", 997 | "integrity": "sha512-B/dOmuoAik5bKcD6s6nXDCjzUKnaDvdkRyAk6rsmsKLipWj4797iothd7jmmUhWTfinVMU+wc56rYKsit2Qy4w==", 998 | "dev": true, 999 | "requires": { 1000 | "path-parse": "^1.0.6" 1001 | } 1002 | }, 1003 | "reusify": { 1004 | "version": "1.0.4", 1005 | "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", 1006 | "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", 1007 | "dev": true 1008 | }, 1009 | "rollup": { 1010 | "version": "2.40.0", 1011 | "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.40.0.tgz", 1012 | "integrity": "sha512-WiOGAPbXoHu+TOz6hyYUxIksOwsY/21TRWoO593jgYt8mvYafYqQl+axaA8y1z2HFazNUUrsMSjahV2A6/2R9A==", 1013 | "dev": true, 1014 | "requires": { 1015 | "fsevents": "~2.3.1" 1016 | } 1017 | }, 1018 | "rollup-plugin-commonjs": { 1019 | "version": "10.1.0", 1020 | "resolved": "https://registry.npmjs.org/rollup-plugin-commonjs/-/rollup-plugin-commonjs-10.1.0.tgz", 1021 | "integrity": "sha512-jlXbjZSQg8EIeAAvepNwhJj++qJWNJw1Cl0YnOqKtP5Djx+fFGkp3WRh+W0ASCaFG5w1jhmzDxgu3SJuVxPF4Q==", 1022 | "dev": true, 1023 | "requires": { 1024 | "estree-walker": "^0.6.1", 1025 | "is-reference": "^1.1.2", 1026 | "magic-string": "^0.25.2", 1027 | "resolve": "^1.11.0", 1028 | "rollup-pluginutils": "^2.8.1" 1029 | } 1030 | }, 1031 | "rollup-plugin-copy": { 1032 | "version": "3.4.0", 1033 | "resolved": "https://registry.npmjs.org/rollup-plugin-copy/-/rollup-plugin-copy-3.4.0.tgz", 1034 | "integrity": "sha512-rGUmYYsYsceRJRqLVlE9FivJMxJ7X6jDlP79fmFkL8sJs7VVMSVyA2yfyL+PGyO/vJs4A87hwhgVfz61njI+uQ==", 1035 | "dev": true, 1036 | "requires": { 1037 | "@types/fs-extra": "^8.0.1", 1038 | "colorette": "^1.1.0", 1039 | "fs-extra": "^8.1.0", 1040 | "globby": "10.0.1", 1041 | "is-plain-object": "^3.0.0" 1042 | } 1043 | }, 1044 | "rollup-plugin-css-only": { 1045 | "version": "3.1.0", 1046 | "resolved": "https://registry.npmjs.org/rollup-plugin-css-only/-/rollup-plugin-css-only-3.1.0.tgz", 1047 | "integrity": "sha512-TYMOE5uoD76vpj+RTkQLzC9cQtbnJNktHPB507FzRWBVaofg7KhIqq1kGbcVOadARSozWF883Ho9KpSPKH8gqA==", 1048 | "dev": true, 1049 | "requires": { 1050 | "@rollup/pluginutils": "4" 1051 | } 1052 | }, 1053 | "rollup-plugin-livereload": { 1054 | "version": "2.0.0", 1055 | "resolved": "https://registry.npmjs.org/rollup-plugin-livereload/-/rollup-plugin-livereload-2.0.0.tgz", 1056 | "integrity": "sha512-oC/8NqumGYuphkqrfszOHUUIwzKsaHBICw6QRwT5uD07gvePTS+HW+GFwu6f9K8W02CUuTvtIM9AWJrbj4wE1A==", 1057 | "dev": true, 1058 | "requires": { 1059 | "livereload": "^0.9.1" 1060 | } 1061 | }, 1062 | "rollup-plugin-node-resolve": { 1063 | "version": "5.2.0", 1064 | "resolved": "https://registry.npmjs.org/rollup-plugin-node-resolve/-/rollup-plugin-node-resolve-5.2.0.tgz", 1065 | "integrity": "sha512-jUlyaDXts7TW2CqQ4GaO5VJ4PwwaV8VUGA7+km3n6k6xtOEacf61u0VXwN80phY/evMcaS+9eIeJ9MOyDxt5Zw==", 1066 | "dev": true, 1067 | "requires": { 1068 | "@types/resolve": "0.0.8", 1069 | "builtin-modules": "^3.1.0", 1070 | "is-module": "^1.0.0", 1071 | "resolve": "^1.11.1", 1072 | "rollup-pluginutils": "^2.8.1" 1073 | } 1074 | }, 1075 | "rollup-plugin-replace": { 1076 | "version": "2.2.0", 1077 | "resolved": "https://registry.npmjs.org/rollup-plugin-replace/-/rollup-plugin-replace-2.2.0.tgz", 1078 | "integrity": "sha512-/5bxtUPkDHyBJAKketb4NfaeZjL5yLZdeUihSfbF2PQMz+rSTEb8ARKoOl3UBT4m7/X+QOXJo3sLTcq+yMMYTA==", 1079 | "dev": true, 1080 | "requires": { 1081 | "magic-string": "^0.25.2", 1082 | "rollup-pluginutils": "^2.6.0" 1083 | } 1084 | }, 1085 | "rollup-plugin-svelte": { 1086 | "version": "7.1.0", 1087 | "resolved": "https://registry.npmjs.org/rollup-plugin-svelte/-/rollup-plugin-svelte-7.1.0.tgz", 1088 | "integrity": "sha512-vopCUq3G+25sKjwF5VilIbiY6KCuMNHP1PFvx2Vr3REBNMDllKHFZN2B9jwwC+MqNc3UPKkjXnceLPEjTjXGXg==", 1089 | "dev": true, 1090 | "requires": { 1091 | "require-relative": "^0.8.7", 1092 | "rollup-pluginutils": "^2.8.2" 1093 | } 1094 | }, 1095 | "rollup-plugin-terser": { 1096 | "version": "7.0.2", 1097 | "resolved": "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-7.0.2.tgz", 1098 | "integrity": "sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ==", 1099 | "dev": true, 1100 | "requires": { 1101 | "@babel/code-frame": "^7.10.4", 1102 | "jest-worker": "^26.2.1", 1103 | "serialize-javascript": "^4.0.0", 1104 | "terser": "^5.0.0" 1105 | } 1106 | }, 1107 | "rollup-pluginutils": { 1108 | "version": "2.8.2", 1109 | "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz", 1110 | "integrity": "sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==", 1111 | "dev": true, 1112 | "requires": { 1113 | "estree-walker": "^0.6.1" 1114 | } 1115 | }, 1116 | "run-parallel": { 1117 | "version": "1.2.0", 1118 | "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", 1119 | "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", 1120 | "dev": true, 1121 | "requires": { 1122 | "queue-microtask": "^1.2.2" 1123 | } 1124 | }, 1125 | "sade": { 1126 | "version": "1.7.4", 1127 | "resolved": "https://registry.npmjs.org/sade/-/sade-1.7.4.tgz", 1128 | "integrity": "sha512-y5yauMD93rX840MwUJr7C1ysLFBgMspsdTo4UVrDg3fXDvtwOyIqykhVAAm6fk/3au77773itJStObgK+LKaiA==", 1129 | "requires": { 1130 | "mri": "^1.1.0" 1131 | } 1132 | }, 1133 | "safe-buffer": { 1134 | "version": "5.2.1", 1135 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 1136 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", 1137 | "dev": true 1138 | }, 1139 | "semiver": { 1140 | "version": "1.1.0", 1141 | "resolved": "https://registry.npmjs.org/semiver/-/semiver-1.1.0.tgz", 1142 | "integrity": "sha512-QNI2ChmuioGC1/xjyYwyZYADILWyW6AmS1UH6gDj/SFUUUS4MBAWs/7mxnkRPc/F4iHezDP+O8t0dO8WHiEOdg==" 1143 | }, 1144 | "semver": { 1145 | "version": "5.7.1", 1146 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", 1147 | "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", 1148 | "dev": true 1149 | }, 1150 | "serialize-javascript": { 1151 | "version": "4.0.0", 1152 | "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", 1153 | "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", 1154 | "dev": true, 1155 | "requires": { 1156 | "randombytes": "^2.1.0" 1157 | } 1158 | }, 1159 | "shebang-command": { 1160 | "version": "1.2.0", 1161 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", 1162 | "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", 1163 | "dev": true, 1164 | "requires": { 1165 | "shebang-regex": "^1.0.0" 1166 | } 1167 | }, 1168 | "shebang-regex": { 1169 | "version": "1.0.0", 1170 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", 1171 | "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", 1172 | "dev": true 1173 | }, 1174 | "shell-quote": { 1175 | "version": "1.7.2", 1176 | "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.2.tgz", 1177 | "integrity": "sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg==", 1178 | "dev": true 1179 | }, 1180 | "sirv": { 1181 | "version": "1.0.11", 1182 | "resolved": "https://registry.npmjs.org/sirv/-/sirv-1.0.11.tgz", 1183 | "integrity": "sha512-SR36i3/LSWja7AJNRBz4fF/Xjpn7lQFI30tZ434dIy+bitLYSP+ZEenHg36i23V2SGEz+kqjksg0uOGZ5LPiqg==", 1184 | "requires": { 1185 | "@polka/url": "^1.0.0-next.9", 1186 | "mime": "^2.3.1", 1187 | "totalist": "^1.0.0" 1188 | } 1189 | }, 1190 | "sirv-cli": { 1191 | "version": "1.0.11", 1192 | "resolved": "https://registry.npmjs.org/sirv-cli/-/sirv-cli-1.0.11.tgz", 1193 | "integrity": "sha512-L8NILoRSBd38VcfFcERYCaVCnWPBLo9G6u/a37UJ8Ysv4DfjizMbFBcM+SswNnndJienhR6qy8KFuAEaeL4g8Q==", 1194 | "requires": { 1195 | "console-clear": "^1.1.0", 1196 | "get-port": "^3.2.0", 1197 | "kleur": "^3.0.0", 1198 | "local-access": "^1.0.1", 1199 | "sade": "^1.6.0", 1200 | "semiver": "^1.0.0", 1201 | "sirv": "^1.0.11", 1202 | "tinydate": "^1.0.0" 1203 | } 1204 | }, 1205 | "slash": { 1206 | "version": "3.0.0", 1207 | "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", 1208 | "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", 1209 | "dev": true 1210 | }, 1211 | "source-map": { 1212 | "version": "0.7.3", 1213 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", 1214 | "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", 1215 | "dev": true 1216 | }, 1217 | "source-map-support": { 1218 | "version": "0.5.19", 1219 | "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", 1220 | "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", 1221 | "dev": true, 1222 | "requires": { 1223 | "buffer-from": "^1.0.0", 1224 | "source-map": "^0.6.0" 1225 | }, 1226 | "dependencies": { 1227 | "source-map": { 1228 | "version": "0.6.1", 1229 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", 1230 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", 1231 | "dev": true 1232 | } 1233 | } 1234 | }, 1235 | "sourcemap-codec": { 1236 | "version": "1.4.6", 1237 | "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.6.tgz", 1238 | "integrity": "sha512-1ZooVLYFxC448piVLBbtOxFcXwnymH9oUF8nRd3CuYDVvkRBxRl6pB4Mtas5a4drtL+E8LDgFkQNcgIw6tc8Hg==", 1239 | "dev": true 1240 | }, 1241 | "spdx-correct": { 1242 | "version": "3.1.0", 1243 | "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", 1244 | "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", 1245 | "dev": true, 1246 | "requires": { 1247 | "spdx-expression-parse": "^3.0.0", 1248 | "spdx-license-ids": "^3.0.0" 1249 | } 1250 | }, 1251 | "spdx-exceptions": { 1252 | "version": "2.2.0", 1253 | "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz", 1254 | "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==", 1255 | "dev": true 1256 | }, 1257 | "spdx-expression-parse": { 1258 | "version": "3.0.0", 1259 | "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", 1260 | "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", 1261 | "dev": true, 1262 | "requires": { 1263 | "spdx-exceptions": "^2.1.0", 1264 | "spdx-license-ids": "^3.0.0" 1265 | } 1266 | }, 1267 | "spdx-license-ids": { 1268 | "version": "3.0.5", 1269 | "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz", 1270 | "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==", 1271 | "dev": true 1272 | }, 1273 | "string.prototype.padend": { 1274 | "version": "3.0.0", 1275 | "resolved": "https://registry.npmjs.org/string.prototype.padend/-/string.prototype.padend-3.0.0.tgz", 1276 | "integrity": "sha1-86rvfBcZ8XDF6rHDK/eA2W4h8vA=", 1277 | "dev": true, 1278 | "requires": { 1279 | "define-properties": "^1.1.2", 1280 | "es-abstract": "^1.4.3", 1281 | "function-bind": "^1.0.2" 1282 | } 1283 | }, 1284 | "string.prototype.trimleft": { 1285 | "version": "2.1.0", 1286 | "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.0.tgz", 1287 | "integrity": "sha512-FJ6b7EgdKxxbDxc79cOlok6Afd++TTs5szo+zJTUyow3ycrRfJVE2pq3vcN53XexvKZu/DJMDfeI/qMiZTrjTw==", 1288 | "dev": true, 1289 | "requires": { 1290 | "define-properties": "^1.1.3", 1291 | "function-bind": "^1.1.1" 1292 | } 1293 | }, 1294 | "string.prototype.trimright": { 1295 | "version": "2.1.0", 1296 | "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.0.tgz", 1297 | "integrity": "sha512-fXZTSV55dNBwv16uw+hh5jkghxSnc5oHq+5K/gXgizHwAvMetdAJlHqqoFC1FSDVPYWLkAKl2cxpUT41sV7nSg==", 1298 | "dev": true, 1299 | "requires": { 1300 | "define-properties": "^1.1.3", 1301 | "function-bind": "^1.1.1" 1302 | } 1303 | }, 1304 | "strip-bom": { 1305 | "version": "3.0.0", 1306 | "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", 1307 | "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", 1308 | "dev": true 1309 | }, 1310 | "supports-color": { 1311 | "version": "5.5.0", 1312 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 1313 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 1314 | "dev": true, 1315 | "requires": { 1316 | "has-flag": "^3.0.0" 1317 | } 1318 | }, 1319 | "svelte": { 1320 | "version": "3.35.0", 1321 | "resolved": "https://registry.npmjs.org/svelte/-/svelte-3.35.0.tgz", 1322 | "integrity": "sha512-gknlZkR2sXheu/X+B7dDImwANVvK1R0QGQLd8CNIfxxGPeXBmePnxfzb6fWwTQRsYQG7lYkZXvpXJvxvpsoB7g==", 1323 | "dev": true 1324 | }, 1325 | "terser": { 1326 | "version": "5.6.0", 1327 | "resolved": "https://registry.npmjs.org/terser/-/terser-5.6.0.tgz", 1328 | "integrity": "sha512-vyqLMoqadC1uR0vywqOZzriDYzgEkNJFK4q9GeyOBHIbiECHiWLKcWfbQWAUaPfxkjDhapSlZB9f7fkMrvkVjA==", 1329 | "dev": true, 1330 | "requires": { 1331 | "commander": "^2.20.0", 1332 | "source-map": "~0.7.2", 1333 | "source-map-support": "~0.5.19" 1334 | } 1335 | }, 1336 | "three": { 1337 | "version": "0.126.1", 1338 | "resolved": "https://registry.npmjs.org/three/-/three-0.126.1.tgz", 1339 | "integrity": "sha512-eOEXnZeE1FDV0XgL1u08auIP13jxdN9LQBAEmlErYzMxtIIfuGIAZbijOyookALUhqVzVOx0Tywj6n192VM+nQ==" 1340 | }, 1341 | "tinydate": { 1342 | "version": "1.3.0", 1343 | "resolved": "https://registry.npmjs.org/tinydate/-/tinydate-1.3.0.tgz", 1344 | "integrity": "sha512-7cR8rLy2QhYHpsBDBVYnnWXm8uRTr38RoZakFSW7Bs7PzfMPNZthuMLkwqZv7MTu8lhQ91cOFYS5a7iFj2oR3w==" 1345 | }, 1346 | "to-regex-range": { 1347 | "version": "5.0.1", 1348 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 1349 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 1350 | "dev": true, 1351 | "requires": { 1352 | "is-number": "^7.0.0" 1353 | } 1354 | }, 1355 | "totalist": { 1356 | "version": "1.1.0", 1357 | "resolved": "https://registry.npmjs.org/totalist/-/totalist-1.1.0.tgz", 1358 | "integrity": "sha512-gduQwd1rOdDMGxFG1gEvhV88Oirdo2p+KjoYFU7k2g+i7n6AFFbDQ5kMPUsW0pNbfQsB/cwXvT1i4Bue0s9g5g==" 1359 | }, 1360 | "universalify": { 1361 | "version": "0.1.2", 1362 | "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", 1363 | "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", 1364 | "dev": true 1365 | }, 1366 | "validate-npm-package-license": { 1367 | "version": "3.0.4", 1368 | "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", 1369 | "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", 1370 | "dev": true, 1371 | "requires": { 1372 | "spdx-correct": "^3.0.0", 1373 | "spdx-expression-parse": "^3.0.0" 1374 | } 1375 | }, 1376 | "which": { 1377 | "version": "1.3.1", 1378 | "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", 1379 | "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", 1380 | "dev": true, 1381 | "requires": { 1382 | "isexe": "^2.0.0" 1383 | } 1384 | }, 1385 | "wrappy": { 1386 | "version": "1.0.2", 1387 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 1388 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", 1389 | "dev": true 1390 | }, 1391 | "ws": { 1392 | "version": "6.2.1", 1393 | "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz", 1394 | "integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==", 1395 | "dev": true, 1396 | "requires": { 1397 | "async-limiter": "~1.0.0" 1398 | } 1399 | } 1400 | } 1401 | } 1402 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "mesh-tiler", 3 | "version": "1.0.0", 4 | "devDependencies": { 5 | "npm-run-all": "^4.1.5", 6 | "rollup": "^2.40.0", 7 | "rollup-plugin-commonjs": "^10.0.0", 8 | "rollup-plugin-copy": "^3.4.0", 9 | "rollup-plugin-css-only": "^3.1.0", 10 | "rollup-plugin-livereload": "^2.0.0", 11 | "rollup-plugin-node-resolve": "^5.2.0", 12 | "rollup-plugin-replace": "^2.2.0", 13 | "rollup-plugin-svelte": "^7.1.0", 14 | "rollup-plugin-terser": "^7.0.2", 15 | "svelte": "^3.35.0" 16 | }, 17 | "dependencies": { 18 | "@mapbox/martini": "^0.2.0", 19 | "@rkaravia/static-map": "^0.2.2", 20 | "leaflet": "^1.7.1", 21 | "sirv-cli": "^1.0.11", 22 | "three": "^0.126.1" 23 | }, 24 | "scripts": { 25 | "build": "rollup -c", 26 | "autobuild": "rollup -c -w", 27 | "dev": "run-p start:dev autobuild", 28 | "start": "sirv public --single", 29 | "start:dev": "sirv public --single --dev" 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /public/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 13 | 14 | 18 | 19 | MeshTiler 20 | 21 | 22 | 23 | 24 | 27 | 28 | 29 | 30 | 31 | 32 | -------------------------------------------------------------------------------- /rollup.config.js: -------------------------------------------------------------------------------- 1 | import css from "rollup-plugin-css-only"; 2 | import copy from "rollup-plugin-copy"; 3 | import svelte from "rollup-plugin-svelte"; 4 | import resolve from "rollup-plugin-node-resolve"; 5 | import replace from "rollup-plugin-replace"; 6 | import commonjs from "rollup-plugin-commonjs"; 7 | import livereload from "rollup-plugin-livereload"; 8 | import { terser } from "rollup-plugin-terser"; 9 | 10 | const production = !process.env.ROLLUP_WATCH; 11 | 12 | if (!process.env.MAPTILER_KEY) { 13 | console.error( 14 | "ERROR: MAPTILER_KEY environment variable is missing, see README.md for more information." 15 | ); 16 | process.exit(); 17 | } 18 | 19 | export default { 20 | input: "src/main.js", 21 | output: { 22 | sourcemap: true, 23 | format: "iife", 24 | name: "app", 25 | file: "public/bundle.js", 26 | }, 27 | plugins: [ 28 | copy({ 29 | targets: [ 30 | { src: "screenshot.png", dest: "public/images" }, 31 | { src: "node_modules/leaflet/dist/images", dest: "public" }, 32 | ], 33 | }), 34 | 35 | svelte({ 36 | compilerOptions: { 37 | // enable run-time checks when not in production 38 | dev: !production, 39 | }, 40 | }), 41 | // we'll extract any component CSS out into 42 | // a separate file - better for performance 43 | css({ output: "bundle.css" }), 44 | 45 | // If you have external dependencies installed from 46 | // npm, you'll most likely need these plugins. In 47 | // some cases you'll need additional configuration - 48 | // consult the documentation for details: 49 | // https://github.com/rollup/plugins/tree/master/packages/commonjs 50 | resolve({ 51 | browser: true, 52 | dedupe: ["svelte"], 53 | }), 54 | 55 | replace({ 56 | MAPTILER_KEY: process.env.MAPTILER_KEY, 57 | }), 58 | 59 | commonjs(), 60 | 61 | // Watch the `public` directory and refresh the 62 | // browser on changes when not in production 63 | !production && livereload("public"), 64 | 65 | // If we're building for production (npm run build 66 | // instead of npm run dev), minify 67 | production && terser(), 68 | ], 69 | watch: { 70 | clearScreen: false, 71 | }, 72 | }; 73 | -------------------------------------------------------------------------------- /screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rkaravia/MeshTiler/509893ed6a48f74d6d3d2299d1e43d7583b7fecc/screenshot.png -------------------------------------------------------------------------------- /src/App.svelte: -------------------------------------------------------------------------------- 1 | 5 | 6 | 18 | 19 |
20 |
21 | 22 |
23 |
24 | 25 |
26 |
27 | -------------------------------------------------------------------------------- /src/components/Map/Map.svelte: -------------------------------------------------------------------------------- 1 | 80 | 81 | 86 | 87 |
88 | -------------------------------------------------------------------------------- /src/components/Map/hash.js: -------------------------------------------------------------------------------- 1 | import getRandomPlace from "../common/places.js"; 2 | import position from "../common/position.js"; 3 | 4 | let lastPosition; 5 | position.subscribe((newPosition) => { 6 | if (newPosition !== null) { 7 | const hash = formatHash(newPosition); 8 | window.location.replace(hash); 9 | } 10 | lastPosition = newPosition; 11 | }); 12 | 13 | if (!update(window.location.hash)) { 14 | position.set(getRandomPlace()); 15 | } 16 | 17 | window.addEventListener("hashchange", () => { 18 | const { hash } = window.location; 19 | if (formatHash(lastPosition) !== hash) { 20 | update(hash); 21 | } 22 | }); 23 | 24 | function update(hash) { 25 | const positionFromHash = parseHash(hash); 26 | if (positionFromHash) { 27 | position.set(positionFromHash); 28 | return true; 29 | } 30 | position.set(undefined); 31 | return false; 32 | } 33 | 34 | function formatHash(position) { 35 | if (position) { 36 | const { lon, lat } = position; 37 | const precision = 5; 38 | return `#${+lon.toFixed(precision)}/${+lat.toFixed(precision)}`; 39 | } 40 | return "#"; 41 | } 42 | 43 | function parseHash(hash) { 44 | if (hash.indexOf("#") === 0) { 45 | const args = hash.substr(1).split("/"); 46 | if (args.length === 2) { 47 | const lon = parseFloat(args[0]); 48 | const lat = parseFloat(args[1]); 49 | if (!isNaN(lon) && !isNaN(lat)) { 50 | return { 51 | lon, 52 | lat, 53 | }; 54 | } 55 | } 56 | } 57 | return false; 58 | } 59 | -------------------------------------------------------------------------------- /src/components/Mesh/Mesh.svelte: -------------------------------------------------------------------------------- 1 | 42 | 43 | 87 | 88 |
89 | 90 | {#if isMeshLoading} 91 | Loading... 92 | {:else if hasMesh} 93 | 94 | 95 | 99 | 100 | 101 |
102 | Code: © Roman Karavia, 103 | 104 | Open Source 105 | 106 | | Data: 107 | {@html mapTilerAttribution} 108 |
109 | {:else} 110 | 111 | Click on the map to choose a location or 112 | go to a random place 113 | 114 | {/if} 115 |
116 | -------------------------------------------------------------------------------- /src/components/Mesh/geometry.js: -------------------------------------------------------------------------------- 1 | import Martini from "@mapbox/martini"; 2 | import { loadImageData } from "./tiles.js"; 3 | import { terrainUrl, terrainSize, meshMaxError } from "../common/config.js"; 4 | 5 | import { BufferAttribute, BufferGeometry } from "three"; 6 | 7 | const gridSize = terrainSize + 1; 8 | 9 | const terrainTileSize = 512; 10 | 11 | export default async function getGeometry(position, zoom) { 12 | const data = await imageData(position, zoom); 13 | const terrain = terrainData(data); 14 | return geometryData(terrain, position, zoom); 15 | } 16 | 17 | function imageData({ lon, lat }, zoom) { 18 | return loadImageData({ 19 | lon, 20 | lat, 21 | zoom: zoom + Math.log2(256 / terrainTileSize), 22 | tileSize: terrainTileSize, 23 | size: terrainSize, 24 | url: terrainUrl, 25 | }); 26 | } 27 | 28 | // Adapted from https://github.com/mapbox/martini/blob/1ca5ca075a169231feb3357c513de774425ff1de/test/util.js 29 | // ISC License, Copyright (c) 2019, Mapbox 30 | function terrainData(data) { 31 | const terrain = new Float32Array(gridSize * gridSize); 32 | 33 | // decode terrain values 34 | for (let y = 0; y < terrainSize; y++) { 35 | for (let x = 0; x < terrainSize; x++) { 36 | const k = (y * terrainSize + x) * 4; 37 | const r = data[k + 0]; 38 | const g = data[k + 1]; 39 | const b = data[k + 2]; 40 | terrain[y * gridSize + x] = 41 | (r * 256 * 256 + g * 256.0 + b) / 10.0 - 10000.0; 42 | } 43 | } 44 | 45 | // backfill right and bottom borders 46 | for (let x = 0; x < gridSize - 1; x++) { 47 | terrain[gridSize * (gridSize - 1) + x] = 48 | terrain[gridSize * (gridSize - 2) + x]; 49 | } 50 | for (let y = 0; y < gridSize; y++) { 51 | terrain[gridSize * y + gridSize - 1] = terrain[gridSize * y + gridSize - 2]; 52 | } 53 | 54 | return terrain; 55 | } 56 | 57 | // Adapted from https://observablehq.com/@mourner/martin-real-time-rtin-terrain-mesh 58 | function geometryData(terrain, { lat }, zoom) { 59 | const martini = new Martini(gridSize); 60 | const tile = martini.createTile(terrain); 61 | const { vertices, triangles } = tile.getMesh(meshMaxError); 62 | const noVertices = vertices.length / 2; 63 | 64 | let minTerrain = Infinity; 65 | for (let i = 0; i < terrain.length; i++) { 66 | minTerrain = Math.min(terrain[i], minTerrain); 67 | } 68 | 69 | const earthRadius = 6378137; 70 | const meters = earthRadius * 2 * Math.PI * Math.cos((lat * Math.PI) / 180); 71 | const pixels = Math.pow(2, zoom) * 256; 72 | const metersPerPixel = meters / pixels; 73 | 74 | const positions = new Float32Array(noVertices * 3); 75 | const uvs = new Float32Array(noVertices * 2); 76 | 77 | for (let i = 0; i < noVertices; i++) { 78 | const x = vertices[2 * i]; 79 | const y = vertices[2 * i + 1]; 80 | 81 | positions[3 * i + 0] = x / terrainSize - 0.5; 82 | positions[3 * i + 1] = 0.5 - y / terrainSize; 83 | positions[3 * i + 2] = 84 | (terrain[y * gridSize + x] - minTerrain) / metersPerPixel / terrainSize; 85 | 86 | uvs[2 * i + 0] = x / terrainSize; 87 | uvs[2 * i + 1] = 1 - y / terrainSize; 88 | } 89 | 90 | const geometry = new BufferGeometry(); 91 | 92 | geometry.addAttribute("position", new BufferAttribute(positions, 3)); 93 | geometry.addAttribute("uv", new BufferAttribute(uvs, 2)); 94 | geometry.setIndex(new BufferAttribute(triangles, 1)); 95 | geometry.computeVertexNormals(); 96 | 97 | return geometry; 98 | } 99 | -------------------------------------------------------------------------------- /src/components/Mesh/mesh.js: -------------------------------------------------------------------------------- 1 | import getGeometry from "./geometry.js"; 2 | import getTexture from "./texture.js"; 3 | 4 | export default async function getMesh(position, zoom) { 5 | const [geometry, texture] = await Promise.all([ 6 | getGeometry(position, zoom), 7 | getTexture(position, zoom), 8 | ]); 9 | return { geometry, texture }; 10 | } 11 | -------------------------------------------------------------------------------- /src/components/Mesh/renderer.js: -------------------------------------------------------------------------------- 1 | import { 2 | Color, 3 | BackSide, 4 | Mesh, 5 | MeshBasicMaterial, 6 | PerspectiveCamera, 7 | Scene, 8 | WebGLRenderer, 9 | } from "three"; 10 | import { OrbitControls } from "three/examples/jsm/controls/OrbitControls"; 11 | 12 | export default class Renderer { 13 | constructor(canvas) { 14 | this.hasGeometry = false; 15 | this.frontMesh = new Mesh(); 16 | this.backMesh = new Mesh(); 17 | this.camera = this._setupCamera(); 18 | this.scene = this._setupScene(); 19 | this.renderer = this._setupRenderer(canvas); 20 | this.controls = this._setupControls(); 21 | 22 | const animate = () => { 23 | requestAnimationFrame(animate); 24 | this.controls.update(); 25 | this.rerender(); 26 | }; 27 | 28 | animate(); 29 | } 30 | 31 | rerender() { 32 | if (this.hasGeometry) { 33 | this.renderer.render(this.scene, this.camera); 34 | } 35 | } 36 | 37 | updateMesh({ geometry, texture }) { 38 | this.hasGeometry = true; 39 | this.frontMesh.geometry = geometry; 40 | this.frontMesh.material = new MeshBasicMaterial({ map: texture }); 41 | this.backMesh.geometry = geometry; 42 | this.backMesh.material = new MeshBasicMaterial({ 43 | color: 0x614d48, 44 | side: BackSide, 45 | }); 46 | this.rerender(); 47 | } 48 | 49 | updateSize(width, height) { 50 | this.camera.aspect = width / height; 51 | this.camera.updateProjectionMatrix(); 52 | this.renderer.setSize(width, height); 53 | this.rerender(); 54 | } 55 | 56 | _setupCamera() { 57 | const camera = new PerspectiveCamera(45, 1, 0.0001, 1000); 58 | camera.position.set(1, 0, 1); 59 | camera.up.set(0, 0, 1); 60 | return camera; 61 | } 62 | 63 | _setupScene() { 64 | const scene = new Scene(); 65 | scene.background = new Color(0xeeeeee); 66 | scene.add(this.frontMesh); 67 | scene.add(this.backMesh); 68 | return scene; 69 | } 70 | 71 | _setupRenderer(canvas) { 72 | const renderer = new WebGLRenderer({ canvas, antialias: true }); 73 | renderer.setPixelRatio(window.devicePixelRatio); 74 | return renderer; 75 | } 76 | 77 | _setupControls() { 78 | const controls = new OrbitControls(this.camera, this.renderer.domElement); 79 | controls.autoRotate = true; 80 | controls.maxPolarAngle = Math.PI / 2; 81 | controls.minDistance = 0.5; 82 | controls.maxDistance = 2; 83 | controls.addEventListener("change", () => this.rerender()); 84 | return controls; 85 | } 86 | } 87 | -------------------------------------------------------------------------------- /src/components/Mesh/texture.js: -------------------------------------------------------------------------------- 1 | import { loadToCanvas } from "./tiles.js"; 2 | import { satelliteUrl, terrainSize, textureSize } from "../common/config.js"; 3 | 4 | import { CanvasTexture } from "three"; 5 | 6 | export default async function getTexture(position, zoom) { 7 | const { lon, lat } = position; 8 | const canvas = await loadToCanvas({ 9 | lon, 10 | lat, 11 | zoom: zoom + Math.log2(textureSize / terrainSize), 12 | size: textureSize, 13 | url: satelliteUrl, 14 | }); 15 | return new CanvasTexture(canvas); 16 | } 17 | -------------------------------------------------------------------------------- /src/components/Mesh/tiles.js: -------------------------------------------------------------------------------- 1 | import StaticMap from "@rkaravia/static-map"; 2 | 3 | export function loadToCanvas(options) { 4 | const { lon, lat, zoom, tileSize, size, url } = options; 5 | const staticMap = new StaticMap([url], { size: tileSize }); 6 | const canvas = document.createElement("canvas"); 7 | canvas.width = size; 8 | canvas.height = size; 9 | return new Promise((resolve) => { 10 | staticMap.getMap(canvas, lon, lat, zoom, () => { 11 | resolve(canvas); 12 | }); 13 | }); 14 | } 15 | 16 | export async function loadImageData(options) { 17 | const canvas = await loadToCanvas(options); 18 | const { size } = options; 19 | const context = canvas.getContext("2d"); 20 | const { data } = context.getImageData(0, 0, size, size); 21 | return data; 22 | } 23 | -------------------------------------------------------------------------------- /src/components/common/config.js: -------------------------------------------------------------------------------- 1 | const key = "MAPTILER_KEY"; 2 | 3 | export const mapUrl = `https://api.maptiler.com/maps/topo/{z}/{x}/{y}{r}.png?key=${key}`; 4 | export const satelliteUrl = `https://api.maptiler.com/tiles/satellite/{z}/{x}/{y}.jpg?key=${key}`; 5 | export const terrainUrl = `https://api.maptiler.com/tiles/terrain-rgb/{z}/{x}/{y}.png?key=${key}`; 6 | 7 | export const mapTilerAttribution = 8 | '© MapTiler'; 9 | export const openStreetMapAttribution = 10 | '© OpenStreetMap'; 11 | 12 | export const meshZoom = 11; 13 | export const terrainSize = 512; 14 | export const textureSize = 1024; 15 | 16 | export const meshMaxError = 1; 17 | -------------------------------------------------------------------------------- /src/components/common/places.js: -------------------------------------------------------------------------------- 1 | const places = [ 2 | { lon: 7.65227, lat: 46.64616 }, 3 | { lon: 9.34352, lat: 47.2493 }, 4 | { lon: 9.86867, lat: 46.49621 }, 5 | { lon: 6.86517, lat: 45.83267 }, 6 | { lon: 8.55889, lat: 46.58153 }, 7 | { lon: 8.57913, lat: 47.12772 }, 8 | { lon: 25.39693, lat: 36.40327 }, 9 | { lon: 138.73078, lat: 35.36278 }, 10 | ]; 11 | 12 | export default function getRandomPlace() { 13 | const index = Math.floor(Math.random() * places.length); 14 | return places[index]; 15 | } 16 | -------------------------------------------------------------------------------- /src/components/common/position.js: -------------------------------------------------------------------------------- 1 | import { writable } from "svelte/store"; 2 | 3 | const position = writable(null); 4 | export default position; 5 | -------------------------------------------------------------------------------- /src/global.css: -------------------------------------------------------------------------------- 1 | html, 2 | body { 3 | position: relative; 4 | width: 100%; 5 | height: 100%; 6 | } 7 | 8 | * { 9 | box-sizing: border-box; 10 | } 11 | 12 | body { 13 | color: #333; 14 | margin: 0; 15 | padding: 4px; 16 | font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, 17 | Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; 18 | } 19 | 20 | a { 21 | color: #0078a8; 22 | text-decoration: none; 23 | } 24 | 25 | a:hover { 26 | text-decoration: underline; 27 | } 28 | 29 | .leaflet-container { 30 | font-family: inherit !important; 31 | } 32 | 33 | @media screen and (max-width: 800px) { 34 | .leaflet-control-zoom { 35 | display: none; 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /src/main.js: -------------------------------------------------------------------------------- 1 | import "leaflet/dist/leaflet.css"; 2 | import "./global.css"; 3 | 4 | import App from "./App.svelte"; 5 | 6 | const app = new App({ 7 | target: document.body, 8 | }); 9 | 10 | export default app; 11 | --------------------------------------------------------------------------------